Seite 1 von 2

Invaild Memory Access mit SqLite3?

Verfasst: 19.05.2007 19:51
von PureBasic4.0
Hi, Leute

Habe mir die UserLib SQLite3 heruntergeladen und folgenden Code ausprobiert:

Code: Alles auswählen

#DBName = "TEST.db"
If Not SQLite3_OpenDatabase(#DBName)
  SQLite3_CreateDatabase(#DBName,0) ; Wofür ist der letzte Parameter eigentlich gedacht?
EndIf
auch dieser Code

Code: Alles auswählen

#DBName = "TEST.db"
If Not SQLite3_OpenDatabase(#DBName)
  SQLite3_CreateDatabase(#DBName,1) ; Wofür ist der letzte Parameter eigentlich gedacht?
EndIf
brachte mir den Invaild Memory Access. Warum? Was mache ich (bzw. die Lib) falsch?

Verfasst: 19.05.2007 20:08
von ts-soft

Code: Alles auswählen

If SQLite3_InitLib("sqlite3.dll") = #False
  MessageRequester("SQLite3-Demo", SQLite3_GetLastMessage())
  End
EndIf
Bitte die Examples auch laden, die Hilfe ist auch nicht komplett.

Re: Invaild Memory Access mit SqLite3?

Verfasst: 19.05.2007 21:00
von Captn. Jinguji
[quote="PureBasic4.0"]Hi, Leute

Habe mir die UserLib SQLite3 heruntergeladen und folgenden Code ausprobiert:

Code: Alles auswählen

#DBName = "TEST.db"
If Not SQLite3_OpenDatabase(#DBName)
  SQLite3_CreateDatabase(#DBName,0) ; Wofür ist der letzte Parameter eigentlich gedacht?
EndIf
Hast Du die Variante "SQLite3_InitLibFromMemory(....)" gewählt ?
Versuch' erstmal, die lib normal zu laden - und natürlich muss initlib
auch klappen (Pfadname richtig ?),wie Thomas schon schrieb.


Ansonsten .. ich würde insbesondere empfehlen, den Rückgabewert von "SQLite3_OpenDatabase" bzw. "SQLite3_CreateDatabase" in einer Variablen aufzufangen, ansonsten wird es etwas schwieriger bei echten DB-Operationen wie "Create TABLE ..." oder "Select..."


Der Parameter schützt eine bereits vorhandene (insbesondere mit Daten bereits gefüllte) DB davor, durch ein versehentliches CReate auf "leer" reduziert zu werden.

Verfasst: 20.05.2007 10:41
von PureBasic4.0
danke. habe jetzt dieses Include genommen; mit dem funktioniert's.

Noch eine Frage:

Wie kann ich damit Datensätze auslesen? Bin schon so weit:

Code: Alles auswählen

SQLite_Execute(DBHandle,"SELECT * FROM Test WHERE User = '"+User$+"'",0)
Also SQL kann ich. Aber wie bekommt man dann aus diesem Befehl die Datensätze heraus?

Verfasst: 20.05.2007 12:09
von Kiffi
PureBasic4.0 hat geschrieben:Aber wie bekommt man dann aus diesem Befehl die Datensätze heraus?
einfach mal das Beispiel durchlesen, welches Thomas unter dem Include gepostet hat.

Grüße ... Kiffi

Verfasst: 20.05.2007 13:46
von PureBasic4.0
OK. Hab's mir mal angeschaut und auch leicht verändert, aber irgendwie bekomme ich einen Invaild Memory Access:

Hier mein Code:

Code: Alles auswählen

    SQliteGetTable(DBHandle, "SELECT * FROM Settings", Table)
      While SQLiteNextRow(Table)
        i + 1 : Debug "_row " + Str(i) + ":"
        While SQLiteNextCol(Table)
          Debug SQLiteValue(Table)
        Wend
      Wend
Diese Abfrage wird in einer Procedure ausgeführt! DBHandle wurde geglobalt

//edit: Habe den Beispielcode jetzt auch mal so umgeschrieben, dass die Hauptaktion (das Auslesen) in einer Procedure passiert. Da gibt es auch einen Invaild Memory Access. Scheint also an der Include zu liegen. Was kann man da machen (außer Bughunting)? ts-soft fragen? :D

Verfasst: 20.05.2007 14:31
von Kiffi
PureBasic4.0 hat geschrieben:aber irgendwie bekomme ich einen Invaild Memory Access:
Du mit Deinen IMAs :lol:

* Hast Du die aktuellste SQLite.DLL?

* Ist Deine Datenbank nicht zufälligerweise kaputt?
PureBasic4.0 hat geschrieben:Hier mein Code:
Table ist vom Typ SQ3_TABLEMAP?

und: Wenn Du ein SQliteGetTable() ausführst, solltest Du unbedingt testen,
ob Table korrekt befüllt wurde.

Code: Alles auswählen

SQliteGetTable(DBHandle, "SELECT * FROM Settings", Table)
If Table ; Wichtig!!!
  While SQLiteNextRow(Table)
  [...]
PureBasic4.0 hat geschrieben:DBHandle wurde geglobalt
... und ist auch wirklich korrekt befüllt?

Grüße ... Kiffi

Verfasst: 20.05.2007 14:37
von PureBasic4.0
Reicht das aus, um DBHandle korrekt zu befüllen?:

Code: Alles auswählen

  DBHandle = SQLiteOpen(#DBName)
  If Not DBHandle 
    MessageRequester("Fehler","Die Datei "+#DBName+" konnte nicht geladen bzw. erstellt werden",#MB_ICONSTOP)
    End
  EndIf
Keine Ahnung, ob ich die neueste SQLite.dll habe. Eigentlich habe ich nichts weiter als die aktuelle PBOSL und das IncludePack.
Kiffi hat geschrieben:Du mit Deinen IMAs :lol:
Nein, PureBasic mit seinen IMAs!

Die Datenbank wird ein paar Zeilen weiter oben erst erstellt! Ich denke, die dürfte nicht korrupt sein. Hier der Code:

Code: Alles auswählen

  If Not ReadFile(0,#DBName)
    neu = 1
  Else
    CloseFile(0)
    neu = 0
  EndIf
  DBHandle = SQLiteOpen(#DBName)
  If Not DBHandle 
    MessageRequester("Fehler","Die Datei "+#DBName+" konnte nicht geladen bzw. erstellt werden",#MB_ICONSTOP)
    End
  EndIf
  If neu = 1
    SQLiteExecute(DBHandle,"CREATE TABLE Profile('Name',IP,Subnetmask,DefaultGateway,DNS1,DNS2,dhcp,autodns)",0)
    SQLiteExecute(DBHandle,"CREATE TABLE Shortcuts('Pfad','Profil','Netzwergeraet')",0)
    SQLiteExecute(DBHandle,"CREATE TABLE Settings('LastDevice','LastProfile')",0)
    SQLiteExecute(DBHandle,"INSERT INTO Settings('LastDevice','LastProfile') VALUES('','')",0)
EndIf
Kiffi hat geschrieben:Table ist vom Typ SQ3_TABLEMAP?
Ich habe irgendwo weiter oben (nicht i.d. Procedure) folgendes stehen:

Code: Alles auswählen

Define.SQ3_TABLEMAP Table
Kiffi hat geschrieben:und: Wenn Du ein SQliteGetTable() ausführst, solltest Du unbedingt testen,
ob Table korrekt befüllt wurde.
Ich habe nicht die Möglichkeit Table zu testen, da es bereits beim SQLiteGetTable() nen IMA gibt
genügt das vorerst?

//edit: Die Codes in diesem Posting werden alle NICHT in der Procedure ausgeführt. Ich möchte lediglich später in einer Procedure auf die DB zugreifen!

Verfasst: 20.05.2007 15:00
von Captn. Jinguji
PureBasic4.0 hat geschrieben:

Code: Alles auswählen

   If neu = 1
    SQLiteExecute(DBHandle,"CREATE TABLE Profile('Name',IP,Subnetmask,DefaultGateway,DNS1,DNS2,dhcp,autodns)",0)
    SQLiteExecute(DBHandle,"CREATE TABLE Shortcuts('Pfad','Profil','Netzwergeraet')",0)
    SQLiteExecute(DBHandle,"CREATE TABLE Settings('LastDevice','LastProfile')",0)
    SQLiteExecute(DBHandle,"INSERT INTO Settings('LastDevice','LastProfile') VALUES('','')",0)
EndIf
!
Öhmm... braucht man bei SQLITE keine Typ- und Größenangaben für die Columns ?

Verfasst: 20.05.2007 15:02
von PureBasic4.0
Captn. Jinguji hat geschrieben: Öhmm... braucht man bei SQLITE keine Typ- und Größenangaben für die Columns ?
k.A. ich bin nur SQL gewöhnt und da schreibt man das so. es heißt auch, wenn man SQLiteErrorMsg(DBHandle) aufruft: "not an error". scheint zu funktionieren.