4.2, SqLite Problem

Für allgemeine Fragen zur Programmierung mit PureBasic.
HJA
Beiträge: 18
Registriert: 21.11.2007 16:58
Wohnort: Wuppertal

4.2, SqLite Problem

Beitrag von HJA »

Hallo zusammen.

Hab mal mit 4.2 etwas probieren willen, was merkwürdig reagiert:

Code: Alles auswählen

UseSQLiteDatabase()

Define Nr.l

  Nr=OpenDatabase(#PB_Any,  "e:\kbo\daten\demodaten.db","","")
  If Nr
    If DatabaseQuery(Nr,"select * from kunden where id=1")
      While NextDatabaseRow(nr)
        Debug "ID: "+GetDatabaseString(Nr,0)
        Debug "Anrede: "+GetDatabaseString(Nr,2)
      Wend
    EndIf
    CloseDatabase(Nr)
    
    Nr=OpenDatabase(#PB_Any,  "e:\kbo\daten\demodaten.db","","")
    Debug "Begin: "+Str(DatabaseUpdate(Nr,"BEGIN TRANSACTION"))
    Debug "Update: "+Str(DatabaseUpdate(Nr,"Update kunden set anrede='www' where id=1"))
  
    Delay(1000)
    Debug "Commit: "+Str(DatabaseUpdate(Nr,"COMMIT"))
    Debug DatabaseError()
    CloseDatabase(Nr)
  EndIf
Dieser Code produziert folgende (richtige) Ausgabe:

ID: 1
Anrede: www
Begin: 1
Update: 1
Commit: 1

Ändere ich den Code in folgenden

Code: Alles auswählen

UseSQLiteDatabase()

Define Nr.l

  Nr=OpenDatabase(#PB_Any,  "e:\kbo\daten\demodaten.db","","")
  If Nr
    If DatabaseQuery(Nr,"select * from kunden where id=1")    <<<< ******
      If NextDatabaseRow(nr)
        Debug "ID: "+GetDatabaseString(Nr,0)
        Debug "Anrede: "+GetDatabaseString(Nr,2)
      EndIf    <<<<< *******
    EndIf
    CloseDatabase(Nr)
    
    Nr=OpenDatabase(#PB_Any,  "e:\kbo\daten\demodaten.db","","")
    Debug "Begin: "+Str(DatabaseUpdate(Nr,"BEGIN TRANSACTION"))
    Debug "Update: "+Str(DatabaseUpdate(Nr,"Update kunden set anrede='www' where id=1"))
  
    Delay(1000)
    Debug "Commit: "+Str(DatabaseUpdate(Nr,"COMMIT"))
    Debug DatabaseError()
    CloseDatabase(Nr)
  EndIf
  
  
erhalte ich als Ausgabe:

ID: 1
Anrede: www
Begin: 1
Update: 1
Commit: 0
database is locked <<<<<<<< ********

Also sobald ich NextdatabaseRow ohne WHILE aufrufe, was bei 1 Satz ja auch nicht nötig wäre.

Entferne ich das Close/Open in der Mitte des Codes, erhalte ich die Fehlermeldung:

"cannot commit transaction - SQL statements in progress" in der Commit Zeile.

Da ich erst seit kurzem mit PB arbeite, kann ich mir daraus zunächst mal keinen reim machen. Hat jemand schonmal ähnliches gehabt? Oder wird das ein Beta Problem sein?

Oder mache ich hier einen Denkensfehler?

Grus
hja
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: 4.2, SqLite Problem

Beitrag von Kiffi »

Hallo HJA,

ich habe in Deinem letzten Codebeispiel CloseDatabase() und
OpenDatabase() entfernt (was bei Dir zu beschriebenen Fehler führt) und bei
mir kein Problem feststellen können.

Allerdings habe ich mir auch nur eine kleine Testdatenbank
zusammengeschraubt. Vielleicht liegt es an der Menge der Daten in Deiner
Datenbank, die zu dem Fehler führt?

Kannst Du u.U. eine Datenbank zum Download anbieten, bei der der Fehler
nachweislich auftritt?

Grüße ... Kiffi
a²+b²=mc²
HJA
Beiträge: 18
Registriert: 21.11.2007 16:58
Wohnort: Wuppertal

Beitrag von HJA »

Hallo Kiffi,

danke für die Hilfe.

Hier ist nochmal ein Code, wo am Anfang auch die DB erstellt wird.
UNDGEÄNDERT erhalte ich den Fehler: "cannot commit transaction - SQL statements in progress"

Ändere ich, siehe REMs, die IF Abfrage gegen WIHLE/WEND läuft er fehlerfrei. Auch kommt kein Fehler mehr, wenn ich in der Mitte das CLOSE/Open durchführe.

Also sogar ein etwas anderer Zustand als in meiner ersten Beschreibung.

Code: Alles auswählen

UseSQLiteDatabase()

Define Nr.l

  ; Wir erstellen mal eine Datenbank.
  Nr=CreateFile(#PB_Any,"e:\kbo\daten\test.db")       
  If NotNr
    MessageRequester("Hinweis","Da ging wohl was schief beim Anlegen der DB")
    End
  EndIf
  CloseFile(Nr)

  
  Nr=OpenDatabase(#PB_Any,  "e:\kbo\daten\test.db","","")
  If Nr
    ; Dann erstellen wir eine kleine Tabelle
    Debug "TB Kunden anlegen: "+Str(DatabaseUpdate(Nr,"CREATE TABLE Kunden (ID Integer Primary Key, KDNR Integer, Anrede TEST)"))
  
    ; und schreiben einen Datensatz hinein  
    Debug "Insert: "+Str(DatabaseUpdate(Nr,"Insert into Kunden (Anrede) values('Firma')"))
  
    ; Nun führen wir eine Abfrage durch die immer nur einen Satz zurückgeben würde
    If DatabaseQuery(Nr,"select * from kunden where id=1")
      ; Dann nutzen wir NextDatabaseRow um auf diesen Satz zu positionieren
      
      If NextDatabaseRow(nr)      ; ****** GEHT NICHT!! *****
      ;While NextDatabaseRow(nr)   ; ****** GEHT ********
        Debug "ID: "+GetDatabaseString(Nr,0)
        Debug "Anrede: "+GetDatabaseString(Nr,2)
      ;Wend
      EndIf
    EndIf
    
    
    ;CloseDatabase(Nr)
    ;Nr=OpenDatabase(#PB_Any,  "e:\kbo\daten\test.db","","")
    
    
    Debug "Begin: "+Str(DatabaseUpdate(Nr,"BEGIN TRANSACTION"))
    Debug "Update: "+Str(DatabaseUpdate(Nr,"Update kunden set anrede='www' where id=1"))
  
    Delay(1000)
    Debug "Commit: "+Str(DatabaseUpdate(Nr,"COMMIT"))
    Debug DatabaseError()
    CloseDatabase(Nr)
  EndIf
  
    
Nachtrag: Da war ein kleiner Fehler: Das mittige Close/open hatte ich den DB namen falsch. Der ist nun richtig. aber damit erhalte ich dann den Fehler "Databse is locked", was meiner Meinung nach an dem IF anstelle Wend liegt. Scheinbar wird durch das IF irgendwie intern eine Aktion gestartet die dann nicht richtrig abgeschlossen wird.


Grüsse aus Wuppertal
HJA
HJA
Beiträge: 18
Registriert: 21.11.2007 16:58
Wohnort: Wuppertal

Beitrag von HJA »

ich habe noch folgendes herausgefunden:

Wenn ich NACH einem Databasequery NextDatabaseRow benutze MUSS ich das in einer While Schleife machen und ALLE Datensätze durchlaufen. Diese Schleife darf ich auch nicht durch Break verlassen! SO kann ich danach Updates machen. Sobald ein Break benutzt wird oder anstelle von WHILE IF, erhalte ich Fehler beim nächsten Update.

Schliesse ich zwischendruch die Datenbank und öffne sie neu, ändert sich lediglich die Fehlermeldung.

Was jedoch geht, wenn ich mit Break verlasse: Führe ich DANACH ein neues DatabaseQuery aus, auch wenn ich es gar nicht benötige, geht es wieder und ich kann danach Updates machen.

hja
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

HJA hat geschrieben:ich habe noch folgendes herausgefunden:
ok, dieser Fehler tritt bei mir nun auch auf. Das scheint mir in der Tat ein Bug
in der 4.2 zu sein.

Soll ich dazu mal was im englischen Board schreiben?

Grüße ... Kiffi

P.S.: Zwei kleine Fehlerchen haben sich in Deinem Beispielcode
eingeschlichen. Kann sein, dass die auch in Deinem richtigen Code
vorhanden sind, deshalb hier der Vollständigkeit halber

Code: Alles auswählen

If NotNr -> If Not Nr

Code: Alles auswählen

"[...] KDNR Integer, Anrede TEST)" -> "[...] KDNR Integer, Anrede TEXT)"
a²+b²=mc²
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

Beitrag von bobobo »

eine vermutliche erklärung

die pb-datanbankfunktionen (zumindest die für sqlite) sind cursorbasiert
und nicht snapshotbasiert ausgelegt. WHILE WEND wäre demnach Pflicht
da ansonsten der cursor am ende vermutlich nicht freigegeben wird was
zu fehlern im weitern verlauf führen mag.

die "herkömmlichen" pd-datenbankfunktionen scheinbar nicht, oder
irgendwie anders da diese ohne solchen fehler auskommen.
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
HJA
Beiträge: 18
Registriert: 21.11.2007 16:58
Wohnort: Wuppertal

Beitrag von HJA »

Hallo,

bobobo: Das While Wend sollte keinesfalls Pflicht sein. Damit wäre man gezwungen ständig Schleifen zu durchlaufen die eigentlich nicht zu durchlaufen sind. Wobei das programmtechnisch ja auch nicht sinnvoll ist. ich könnte ja abhängig von den Werten der Tabelle andere Datensätze ändern müssen.

Es wird aber eher ein Beta Problem zu sein.

Das Problem weitet sich sogar noch aus: Wenn man nämlich IN der Schleife eine völlig andere Tabelle ändern will, geht das auch nicht. ich kann erst wieder irgendeine Tabelle ändern, wenn jede vorhergehende Tabelle einmal durch die komplette Schleife gelaufen ist.

Kiffi: Lesen die Programmierer in den englischen Foren? Dann wäre es sicher nicht schlecht, wenn es dort auch stünde. Mein Englisch reicht da sicher nicht aus um das verständlich genug zu beschreiben. Danke.


Grüße
hja
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

Beitrag von bobobo »

ömm ja
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

Beitrag von bobobo »

ich melde das im bugForum
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Antworten