Seite 1 von 2
PB4.60RC1 Probleme mit SQlite Wrapper
Verfasst: 13.09.2011 07:08
von dige
Verwendet jemand einen eigenen Wrapper für SQlite und läuft dieser
noch mit der obigen Version?
Folgender Code funktionierte bis PB4.60B3
Code: Alles auswählen
Global sqlite3_open.l
Global sqlite3_libversion.l
#SQLITE3_OK = 0 ; Successful Result
#SQLITE3_ERROR = 1 ; SQL error Or missing database
Procedure.l SQLite3_Init()
Protected LibNr.l
LibNr_SQlite3 = OpenLibrary(#PB_Any, "sqlite3.dll")
If LibNr_SQlite3
sqlite3_open = GetFunction(LibNr_SQlite3, "sqlite3_open")
sqlite3_libversion = GetFunction(LibNr_SQlite3, "sqlite3_libversion")
ProcedureReturn #TRUE
Else
ProcedureReturn #False
EndIf
EndProcedure
Procedure.s SQLite3_GetVersion()
Protected Result
If sqlite3_libversion
Result = CallFunctionFast(sqlite3_libversion)
EndIf
If Result
ProcedureReturn PeekS(Result)
Else
ProcedureReturn "0.0.0"
EndIf
EndProcedure
Procedure.b SQLite3_OpenDatabase(sDataBase.s)
If CallCFunctionFast(sqlite3_open, @sDataBase, @lDataBaseHandle) = #SQLITE3_OK ; <-- IMA
Debug sDataBase
ProcedureReturn #SQLITE3_OK
EndIf
EndProcedure
SQLite3_Init()
Debug SQLite3_OpenDatabase(":memory:" )
Debug SQLite3_GetVersion()
Das ändern auf CallFunctionFast() bringt auch nix.
Irgendwas muss sich mit RC1 bzgl. der FunctionCalls geändert haben...
Re: PB4.60RC1 Probleme mit SQlite Wrapper
Verfasst: 13.09.2011 09:18
von Kiffi
dige hat geschrieben:Verwendet jemand einen eigenen Wrapper für SQlite
zur eigentlichen Problematik kann ich nicht viel sagen, aber:
Wieso benutzt Du eigentlich den Wrapper? Benötigst Du dort
Funktionalitäten, die die PB Database-Lib nicht bietet?
Grüße ... Kiffi
Re: PB4.60RC1 Probleme mit SQlite Wrapper
Verfasst: 13.09.2011 11:58
von dige
Mmmh, mit der PB Database Lib kann man nicht asynchron arbeiten,
da ein SELECT keinen eigenen Speicherbereich bekommt.
Ausserdem passt mir das While NextDatabaseRow() Prinzip nicht.
Ich möchte die Inhalte via Array auslesen können...
Re: PB4.60RC1 Probleme mit SQlite Wrapper
Verfasst: 13.09.2011 16:59
von Kiffi
dige hat geschrieben:Mmmh, mit der PB Database Lib kann man nicht asynchron arbeiten,
da ein SELECT keinen eigenen Speicherbereich bekommt.
Ausserdem passt mir das While NextDatabaseRow() Prinzip nicht.
Ich möchte die Inhalte via Array auslesen können...
ok, das sind nachvollziehbare Argumente. Naja, vielleicht melden sich F&f
ja im englischen Forum. Da sind ja offensichtlich Änderungen bei den
Call*-Funktionen vorgenommen worden.
Grüße ... Kiffi
Re: PB4.60RC1 Probleme mit SQlite Wrapper
Verfasst: 13.09.2011 17:41
von bobobo
asynchron heisst hier was ?
diese nickeligkeiten von pb was sqlite angeht kann man ein wenig umgehen
wenn man den sqliteodbc-treiber von
http://www.ch-werner.de/sqliteodbc/
benutzt.
Re: PB4.60RC1 Probleme mit SQlite Wrapper
Verfasst: 13.09.2011 19:19
von Christian+
Nun was das Problem an dem CallFunctionFast() ist habe ich auch keine Idee aber du könntest einfach PrototypeC verwenden oder denn damit würde es gehen und dann kann dir das Problem mit CallFunctionFast() egal sein weil du es nicht mehr brauchst.
Re: PB4.60RC1 Probleme mit SQlite Wrapper
Verfasst: 14.09.2011 09:53
von dige
Hatte ich auch schon getestet. Mit PrototypeC ist der
Result = 0 und mit Prototype crasht es:
Code: Alles auswählen
PrototypeC.l Proto_Sqlite_OpenDataBase(*sDataBase)
Global sqlite3_open.Proto_Sqlite_OpenDataBase
Procedure Main()
LibNr_SQlite3 = OpenLibrary(#PB_Any, "sqlite3.dll")
If LibNr_SQlite3
sqlite3_open.Proto_Sqlite_OpenDataBase = GetFunction(LibNr_SQlite3, "sqlite3_open")
EndIf
sDatabase.s = ":memory:"
Result = sqlite3_open (@sDatabase)
ProcedureReturn Result
EndProcedure
Debug Main()
Re: PB4.60RC1 Probleme mit SQlite Wrapper
Verfasst: 14.09.2011 10:12
von Christian+
Also dein ursprüngliches Beispiel konnte ich ohne Probleme anpassen.
Code: Alles auswählen
PrototypeC.i sqlite3_open(sDataBase.p-utf8, *lDataBaseHandle)
PrototypeC.i sqlite3_libversion()
Global sqlite3_open.sqlite3_open
Global sqlite3_libversion.sqlite3_libversion
#SQLITE3_OK = 0 ; Successful Result
#SQLITE3_ERROR = 1 ; SQL error Or missing database
Procedure.l SQLite3_Init()
LibNr_SQlite3 = OpenLibrary(#PB_Any, "sqlite3.dll")
If LibNr_SQlite3
sqlite3_open = GetFunction(LibNr_SQlite3, "sqlite3_open")
sqlite3_libversion = GetFunction(LibNr_SQlite3, "sqlite3_libversion")
ProcedureReturn #True
Else
ProcedureReturn #False
EndIf
EndProcedure
Procedure.s SQLite3_GetVersion()
Protected Result
If sqlite3_libversion
Result = sqlite3_libversion()
EndIf
If Result
ProcedureReturn PeekS(Result, -1, #PB_UTF8)
Else
ProcedureReturn "0.0.0"
EndIf
EndProcedure
Procedure.b SQLite3_OpenDatabase(sDataBase.s)
If sqlite3_open(sDataBase, @lDataBaseHandle) = #SQLITE3_OK ; <-- IMA
Debug sDataBase
ProcedureReturn #SQLITE3_OK
EndIf
EndProcedure
SQLite3_Init()
Debug SQLite3_OpenDatabase(":memory:" )
Debug SQLite3_GetVersion()
Re: PB4.60RC1 Probleme mit SQlite Wrapper
Verfasst: 14.09.2011 10:57
von dige
Hallo Christian+, vielen Dank für Deine Umsetzung. Ich habe alle anderen
Funktionen ergänzt. Im Beispiel funktioniert auch alles, nur innerhalb
meines eigentlichen Programmes erhalte ich bei:
Code: Alles auswählen
Result = sqlite3_get_table (lDataBaseHandle, sSQLQuery, @lResultsPtr, @Rows, @Cols, @ReturnValue)
einen ungültigen Speicherzugriff.
Code: Alles auswählen
PrototypeC.i sqlite3_open(sDataBase.p-utf8, *lDataBaseHandle)
PrototypeC.i sqlite3_libversion()
PrototypeC.i sqlite3_get_table (lDataBaseHandle, sSQLQuery.p-utf8, *lResultsPtr, *Rows, *Cols, *ReturnValue)
PrototypeC.i sqlite3_exec (lDataBaseHandle, sSQLQuery.p-utf8, pCallback, Arg, *ReturnValue)
PrototypeC.i sqlite3_free_table (lResultsPtr)
PrototypeC.i sqlite3_close(lDataBaseHandle)
PrototypeC.i sqlite3_errmsg(*ReturnValue)
Global sqlite3_open.sqlite3_open
Global sqlite3_libversion.sqlite3_libversion
Global sqlite3_exec.sqlite3_exec
Global sqlite3_close.sqlite3_close
Global sqlite3_errmsg.sqlite3_errmsg
Global sqlite3_get_table.sqlite3_get_table
Global sqlite3_free_table.sqlite3_free_table
Global lDataBaseHandle
#SQLITE3_OK = 0 ; Successful Result
#SQLITE3_ERROR = 1 ; SQL error Or missing database
Procedure.l SQLite3_Init()
LibNr_SQlite3 = OpenLibrary(#PB_Any, "sqlite3.dll")
If LibNr_SQlite3
sqlite3_open = GetFunction(LibNr_SQlite3, "sqlite3_open")
sqlite3_libversion = GetFunction(LibNr_SQlite3, "sqlite3_libversion")
sqlite3_exec = GetFunction(LibNr_SQlite3, "sqlite3_exec")
sqlite3_close = GetFunction(LibNr_SQlite3, "sqlite3_close")
sqlite3_errmsg = GetFunction(LibNr_SQlite3, "sqlite3_errmsg")
sqlite3_get_table = GetFunction(LibNr_SQlite3, "sqlite3_get_table")
sqlite3_free_table = GetFunction(LibNr_SQlite3, "sqlite3_free_table")
ProcedureReturn #TRUE
Else
ProcedureReturn #False
EndIf
EndProcedure
Procedure.b SQLite3_OpenDatabase(sDataBase.s)
If sqlite3_open(sDataBase, @lDataBaseHandle) = #SQLITE3_OK ; <-- IMA
Debug sDataBase
ProcedureReturn #SQLITE3_OK
EndIf
EndProcedure
SQLite3_Init()
Debug SQLite3_OpenDatabase(":memory:" )
Debug SQLite3_GetVersion()
Debug sqlite3_exec (lDataBaseHandle, "CREATE TABLE TEST (ID INTEGER)", #Null, #Null, @ReturnValue)
Debug ReturnValue
If ReturnValue : Debug PeekS(ReturnValue) : EndIf
Debug sqlite3_exec (lDataBaseHandle, "INSERT INTO TEST (ID) VALUES(1)", #Null, #Null, @ReturnValue)
Debug sqlite3_exec (lDataBaseHandle, "INSERT INTO TEST (ID) VALUES(2)", #Null, #Null, @ReturnValue)
Debug sqlite3_exec (lDataBaseHandle, "INSERT INTO TEST (ID) VALUES(3)", #Null, #Null, @ReturnValue)
Debug sqlite3_get_table (lDataBaseHandle, "SELECT * FROM TEST", @lResultsPtr, @Rows, @Cols, @ReturnValue)
Debug ReturnValue
If ReturnValue : Debug PeekS(ReturnValue) : EndIf
Debug Rows
Debug Cols
Debug PeekS(lResultsPtr)
Re: PB4.60RC1 Probleme mit SQlite Wrapper
Verfasst: 14.09.2011 11:12
von dige
Erledigt. Mit Änderung des Strukturtypes auf .p-ascii gehts
