Absturz bei SQLite Suchfunktion

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
steelbasic
Beiträge: 63
Registriert: 02.09.2004 19:41
Wohnort: Niedersachsen

Absturz bei SQLite Suchfunktion

Beitrag von steelbasic »

Hallo,

ich habe ein Problem mit SQLite. Immer wenn ich etwas Suche was in der Datenbank nicht vorhanden ist, stürzt das Programm mit Speicherfehler ab(kann read nicht ausführen ...). Ich habe mir da eine Abfrage gebastelt, die dies Abfangen soll (siehe Laenge$ und laenge). Leider ohne Funktion.

Hat jemand einen einen Tipp?

Code: Alles auswählen

        Case #Suche     
              ;daten holen / suchen 
              sucheeintrag$ = GetGadgetText(#sucheeintrag)
              SQLite3_GetTable(" SELECT  * FROM VPDruck WHERE IDNr= '" + sucheeintrag$ + "' Or Produkt='" + sucheeintrag$ + "' Or Korn='" + sucheeintrag$ + "' Or Hersteller='" + sucheeintrag$ + "'" , @myRows, @myCols, sqlite3_dbHandle)

                Laenge$ = (DBData(Row,Col))               ;Abfrage ob ein Ergebnis gefunden wurde
                Laenge = Len(Laenge$) 
               If Laenge > 0                             ;Abfrage ob ein Ergebnis gefunden wurde
                     IDNr$ = DBData(Row+1, Col+0)
                     Produkt$ = DBData(Row+1, Col+1)
                     Korn$ = DBData(Row+1, Col+2)
                     Hersteller$ = DBData(Row+1, Col+3)
                     ClearGadgetItemList(#Listview_0)       ;Listview löschen
                     AddGadgetItem(#Listview_0,0,IDNr$+" ; " + Produkt$+" ; " + Korn$+" ; "+Hersteller$)
                     lastaktion$ = "Suche erfolgreich"
                  Else
                     ClearGadgetItemList(#Listview_0)       ;Listview löschen
                     AddGadgetItem(#Listview_0,0, "Suche ohne Ergebnis")
                     lastaktion$ = "Suche ohne Ergebnis"
                  EndIf
Viele Grüße
Hein Blöd
Benutzeravatar
Kiffi
Beiträge: 10719
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Absturz bei SQLite Suchfunktion

Beitrag von Kiffi »

> Immer wenn ich etwas Suche was in der Datenbank nicht vorhanden ist,
> stürzt das Programm mit Speicherfehler ab

der Fehler liegt in der SQLite3_GetTable(). Vor der Dimensionierung von
DBData() muss überprüft werden, ob LRows und LCols keine negativen
Werte haben.

Code: Alles auswählen

    If LRows > -1 And LCols > 0 ; diese Zeile muss in Deinen Code eingefügt werden
    
      Dim DBData.s(LRows, LCols - 1)
      
      ; copy data into array
      Address.l  = LResultsPtr
      AddrInc.l  = LCols * 4
      
      For Row.l  = 0 To LRows
        For Col.l  = 0 To LCols - 1
          DBData(Row, Col) = PeekS(PeekL(Address + Col  * 4))
        Next
        Address  + AddrInc
      Next

    EndIf ; diese Zeile muss in Deinen Code eingefügt werden
In 'Code, Tipps und Tricks' habe ich das schon korrigiert.

Grüße ... Kiffi
Benutzeravatar
steelbasic
Beiträge: 63
Registriert: 02.09.2004 19:41
Wohnort: Niedersachsen

Beitrag von steelbasic »

Hallo Kiffi,

habe die Include aus Code, Tipps übernommen. Und meinen Code in ergänzt (verschiedene Versuche). Jetzt findet er gar nichts mehr. Besser als ein Absturz aber immer noch nicht das was ich möchte. Ich habe mal meinen ganzen Hauptcode unten. Vielleicht könntest du dich noch einmal diesem Problem zuwenden!

Code: Alles auswählen

IncludeFile "sqlite3_include.pbi" 
IncludeFile "sqlite3_design.pb"
Open_Window_0()

;DeleteFile("VPDruck.db") 
  
;SQLite3_Init() 
    If SQLite3_Init()   
      sqlite3_dbHandle = SQLite3_OpenDatabase("VPDruck.db") 
      lastaktion$ = "Datenbank geöffnet"
        If sqlite3_dbHandle 
          sSQL.s = "CREATE TABLE VPDruck(IDNr, Produkt, Korn, Hersteller);"
          SQLite3_Execute(sSQL, sqlite3_dbHandle) 
        EndIf  
    Else
      MessageRequester("SQLite3", "Konnte Datenbank nicht öffnen / erstellen") 
      
    EndIf 
  
  
Repeat
  EventID = WaitWindowEvent()
  Select EventID 
    Case #PB_Event_Gadget 
      Select EventGadgetID()
        Case #hinzu 
          hinzufeld1$ = GetGadgetText(#hinzufeld1)
          hinzufeld2$ = GetGadgetText(#hinzufeld2)
          hinzufeld3$ = GetGadgetText(#hinzufeld3)
          hinzufeld4$ = GetGadgetText(#hinzufeld4)
          
          ;Daten einfügen
          sSQL.s = "INSERT INTO VPDruck  (IDNr, Produkt, Korn, Hersteller) VALUES ('"+ hinzufeld1$ + "','" + hinzufeld2$ + "','"+ hinzufeld3$+"','"+ hinzufeld4$ +"');"
          SQLite3_Execute(sSQL, sqlite3_dbHandle)
          lastaktion$ = "Daten hinzugefügt"

        Case #ende                                              ;Programmende
            SQLite3_CloseDatabase(sqlite3_dbHandle)
            End 

        Case #info
              ;Anzahl Reihen (Datensätze) und Spaltenanzahl anzeigen
               SQLite3_GetTable("SELECT * FROM VPDruck", @myRows, @myCols, sqlite3_dbHandle) 
            
               SetGadgetText(#zeilen,Str(myRows))
               SetGadgetText(#spalten,Str(myCols))
               lastaktion$ = "Info angefordert"

              ;Daten im Listview anzeigen
               ClearGadgetItemList(#Listview_0)        ;Listview löschen
               For i  = 1 To myRows 
                IDNr$ = DBData(Row+i, Col+0)
                Produkt$ = DBData(Row+i, Col+1)
                Korn$ = DBData(Row+i, Col+2)
                Hersteller$ = DBData(Row+i, Col+3)
                AddGadgetItem(#Listview_0,0,IDNr$+" ; " + Produkt$+" ; " + Korn$+" ; "+Hersteller$)
               Next
            
              ;Spaltentext anzeigen
              SetGadgetText(#spalte1,(DBData(0,Col+0)))
              SetGadgetText(#spalte2,(DBData(0,Col+1)))
              SetGadgetText(#spalte3,(DBData(0,Col+2)))
              SetGadgetText(#spalte4,(DBData(0,Col+3)))
      
              SetGadgetText(#DBname,"VPDruck.db")
        Case #Suche     
              ;daten holen / suchen 
              sucheeintrag$ = GetGadgetText(#sucheeintrag)
              SQLite3_GetTable(" SELECT  * FROM VPDruck WHERE IDNr= '" + sucheeintrag$ + "' Or Produkt='" + sucheeintrag$ + "' Or Korn='" + sucheeintrag$ + "' Or Hersteller='" + sucheeintrag$ + "'" , @myRows, @myCols, sqlite3_dbHandle)
;                Laenge$ = (DBData(Row,Col))               ;Abfrage ob ein Ergebnis gefunden wurde
;                Laenge = Len(Laenge$) 
               If Row > -1 And Col > 0                     ;Abfrage ob ein Ergebnis gefunden wurde
                     IDNr$ = DBData(Row+1, Col+0)
                     Produkt$ = DBData(Row+1, Col+1)
                     Korn$ = DBData(Row+1, Col+2)
                     Hersteller$ = DBData(Row+1, Col+3)
                     ClearGadgetItemList(#Listview_0)       ;Listview löschen
                     AddGadgetItem(#Listview_0,0,IDNr$+" ; " + Produkt$+" ; " + Korn$+" ; "+Hersteller$)
                     lastaktion$ = "Suche erfolgreich"
               Else
                     ClearGadgetItemList(#Listview_0)       ;Listview löschen
                     AddGadgetItem(#Listview_0,0, "Suche ohne Ergebnis")
                     lastaktion$ = "Suche ohne Ergebnis"
               EndIf

        Case #aendern
              ;Daten ändern
              lastaktion$ = "Scheiße.... noch keine Funktion vorhanden!"
 
        Case #loeschen
              ;Daten loeschen
              loeschID$ = GetGadgetText(#hinzufeld1)
              sSQL.s = "DELETE FROM VPDruck WHERE IDNr = '" +  loeschID$ + "'"
              SQLite3_Execute(sSQL, sqlite3_dbHandle)
               
              lastaktion$ = ("Datensatz mit IDnr: " + loeschID$ + " gelöscht")
     
         EndSelect
  EndSelect          
 
  StatusBarText(#StatusBar,0,"letzte Aktion: " + lastaktion$) 
Until EventID = #PB_EventCloseWindow  

SQLite3_CloseDatabase(sqlite3_dbHandle)
End  
:(
Viele Grüße
Hein Blöd
Benutzeravatar
Kiffi
Beiträge: 10719
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

Code: Alles auswählen

 SQLite3_GetTable(" SELECT  * FROM VPDruck [...]" , @myRows, @myCols, sqlite3_dbHandle)
nochmals: Der SQLite3_GetTable() liefert in myRows und
myCols zurück, wieviel Zeilen und Spalten gefunden wurden.
Demzufolge ist die nachfolgende Zeile...

Code: Alles auswählen

 If Row > -1 And Col > 0 ;Abfrage ob ein Ergebnis gefunden wurde
... falsch und sollte so lauten:

Code: Alles auswählen

 If myRows > 0  ;Abfrage ob ein Ergebnis gefunden wurde
Grüße ... Kiffi
Benutzeravatar
steelbasic
Beiträge: 63
Registriert: 02.09.2004 19:41
Wohnort: Niedersachsen

Beitrag von steelbasic »

@ Kiffi
Es funktioniert nun, habe auch schon weiter gemacht.

Besten Dank
Viele Grüße
Hein Blöd
Antworten