Invaild Memory Access mit SqLite3?

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
PureBasic4.0
Beiträge: 785
Registriert: 29.10.2006 17:26
Wohnort: 127.0.0.1

Invaild Memory Access mit SqLite3?

Beitrag 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?
PB 4.50 RC1 + Ubuntu 10.04 LTS + Windows 7 x64
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Captn. Jinguji
Beiträge: 397
Registriert: 07.06.2005 19:47
Computerausstattung: PB 4.73x64, i7, WIN 10x64, ATI NVidia RTX 2070
Wohnort: Witten

Re: Invaild Memory Access mit SqLite3?

Beitrag 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.
Ist das Kunst hier, oder kann das weg ?
Benutzeravatar
PureBasic4.0
Beiträge: 785
Registriert: 29.10.2006 17:26
Wohnort: 127.0.0.1

Beitrag 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?
PB 4.50 RC1 + Ubuntu 10.04 LTS + Windows 7 x64
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag 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
a²+b²=mc²
Benutzeravatar
PureBasic4.0
Beiträge: 785
Registriert: 29.10.2006 17:26
Wohnort: 127.0.0.1

Beitrag 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
PB 4.50 RC1 + Ubuntu 10.04 LTS + Windows 7 x64
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag 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
a²+b²=mc²
Benutzeravatar
PureBasic4.0
Beiträge: 785
Registriert: 29.10.2006 17:26
Wohnort: 127.0.0.1

Beitrag 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!
PB 4.50 RC1 + Ubuntu 10.04 LTS + Windows 7 x64
Benutzeravatar
Captn. Jinguji
Beiträge: 397
Registriert: 07.06.2005 19:47
Computerausstattung: PB 4.73x64, i7, WIN 10x64, ATI NVidia RTX 2070
Wohnort: Witten

Beitrag 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 ?
Ist das Kunst hier, oder kann das weg ?
Benutzeravatar
PureBasic4.0
Beiträge: 785
Registriert: 29.10.2006 17:26
Wohnort: 127.0.0.1

Beitrag 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.
PB 4.50 RC1 + Ubuntu 10.04 LTS + Windows 7 x64
Antworten