Although this thread is quite old I'd like to post a more complete example to demonstrate how to get the error number instead of the error message.
HanPBF had 2 problems in the end:
* ErrorNumber is always 1 >> this is correct for all sql-errors as the sqlite reference uses this for the error "SQL error or missing database" (SQLITE_ERROR)
* ErrorMessage is "????" - this is because it is stored as UTF8 in the memory and so the specification of the format is necessary for the PeekS
Details about the ResultMessages/Codes for SQLite can be found here
http://www.sqlite.org/c3ref/errcode.html
Here's my example:
Code: Select all
EnableExplicit
; Database
Enumeration
#DB
EndEnumeration
;- BEGIN SQLite ResultMessageArea
; http://www.sqlite.org/c3ref/errcode.html
ImportC ""
sqlite3_errcode(hDB.i)
sqlite3_extended_errcode(hDB.i)
sqlite3_errmsg(hDB.i)
sqlite3_errstr(ErrCode.i)
EndImport
; SQLite C Interface - Result Codes
#SQLITE_OK= 0 ; Successful result
; beginning-of-error-codes
#SQLITE_ERROR= 1 ; SQL error Or missing database
#SQLITE_INTERNAL= 2 ; Internal logic error in SQLite
#SQLITE_PERM= 3 ; Access permission denied
#SQLITE_ABORT= 4 ; Callback routine requested an abort
#SQLITE_BUSY= 5 ; The database file is locked
#SQLITE_LOCKED= 6 ; A table in the database is locked
#SQLITE_NOMEM= 7 ; A malloc() failed
#SQLITE_READONLY= 8 ; Attempt To write a readonly database
#SQLITE_INTERRUPT= 9 ; Operation terminated by sqlite3_interrupt()*/
#SQLITE_IOERR= 10 ; Some kind of disk I/O error occurred
#SQLITE_CORRUPT= 11 ; The database disk image is malformed
#SQLITE_NOTFOUND= 12 ; Unknown opcode in sqlite3_file_control()
#SQLITE_FULL= 13 ; Insertion failed because database is full
#SQLITE_CANTOPEN= 14 ; Unable To open the database file
#SQLITE_PROTOCOL= 15 ; Database lock protocol error
#SQLITE_EMPTY= 16 ; Database is empty
#SQLITE_SCHEMA= 17 ; The database schema changed
#SQLITE_TOOBIG= 18 ; String Or BLOB exceeds size limit
#SQLITE_CONSTRAINT= 19 ; Abort due To constraint violation
#SQLITE_MISMATCH= 20 ; Data type mismatch
#SQLITE_MISUSE= 21 ; Library used incorrectly
#SQLITE_NOLFS= 22 ; Uses OS features Not supported on host
#SQLITE_AUTH= 23 ; Authorization denied
#SQLITE_FORMAT= 24 ; Auxiliary database format error
#SQLITE_RANGE= 25 ; 2nd parameter To sqlite3_bind out of range
#SQLITE_NOTADB= 26 ; File opened that is Not a database file
#SQLITE_NOTICE= 27 ; Notifications from sqlite3_log()
#SQLITE_WARNING= 28 ; Warnings from sqlite3_log()
#SQLITE_ROW= 100 ; sqlite3_step() has another row ready
#SQLITE_DONE= 101 ; sqlite3_step() has finished executing
; End-of-error-codes
; SQLite C Interface - Extended Result Codes
#SQLITE_IOERR_READ =(#SQLITE_IOERR | (1<<8))
#SQLITE_IOERR_SHORT_READ =(#SQLITE_IOERR | (2<<8))
#SQLITE_IOERR_WRITE =(#SQLITE_IOERR | (3<<8))
#SQLITE_IOERR_FSYNC =(#SQLITE_IOERR | (4<<8))
#SQLITE_IOERR_DIR_FSYNC =(#SQLITE_IOERR | (5<<8))
#SQLITE_IOERR_TRUNCATE =(#SQLITE_IOERR | (6<<8))
#SQLITE_IOERR_FSTAT =(#SQLITE_IOERR | (7<<8))
#SQLITE_IOERR_UNLOCK =(#SQLITE_IOERR | (8<<8))
#SQLITE_IOERR_RDLOCK =(#SQLITE_IOERR | (9<<8))
#SQLITE_IOERR_DELETE =(#SQLITE_IOERR | (10<<8))
#SQLITE_IOERR_BLOCKED =(#SQLITE_IOERR | (11<<8))
#SQLITE_IOERR_NOMEM =(#SQLITE_IOERR | (12<<8))
#SQLITE_IOERR_ACCESS =(#SQLITE_IOERR | (13<<8))
#SQLITE_IOERR_CHECKRESERVEDLOCK =(#SQLITE_IOERR | (14<<8))
#SQLITE_IOERR_LOCK =(#SQLITE_IOERR | (15<<8))
#SQLITE_IOERR_CLOSE =(#SQLITE_IOERR | (16<<8))
#SQLITE_IOERR_DIR_CLOSE =(#SQLITE_IOERR | (17<<8))
#SQLITE_IOERR_SHMOPEN =(#SQLITE_IOERR | (18<<8))
#SQLITE_IOERR_SHMSIZE =(#SQLITE_IOERR | (19<<8))
#SQLITE_IOERR_SHMLOCK =(#SQLITE_IOERR | (20<<8))
#SQLITE_IOERR_SHMMAP =(#SQLITE_IOERR | (21<<8))
#SQLITE_IOERR_SEEK =(#SQLITE_IOERR | (22<<8))
#SQLITE_IOERR_DELETE_NOENT =(#SQLITE_IOERR | (23<<8))
#SQLITE_IOERR_MMAP =(#SQLITE_IOERR | (24<<8))
#SQLITE_LOCKED_SHAREDCACHE =(#SQLITE_LOCKED | (1<<8))
#SQLITE_BUSY_RECOVERY =(#SQLITE_BUSY | (1<<8))
#SQLITE_CANTOPEN_NOTEMPDIR =(#SQLITE_CANTOPEN | (1<<8))
#SQLITE_CANTOPEN_ISDIR =(#SQLITE_CANTOPEN | (2<<8))
#SQLITE_CANTOPEN_FULLPATH =(#SQLITE_CANTOPEN | (3<<8))
#SQLITE_CORRUPT_VTAB =(#SQLITE_CORRUPT | (1<<8))
#SQLITE_READONLY_RECOVERY =(#SQLITE_READONLY | (1<<8))
#SQLITE_READONLY_CANTLOCK =(#SQLITE_READONLY | (2<<8))
#SQLITE_READONLY_ROLLBACK =(#SQLITE_READONLY | (3<<8))
#SQLITE_ABORT_ROLLBACK =(#SQLITE_ABORT | (2<<8))
#SQLITE_CONSTRAINT_CHECK =(#SQLITE_CONSTRAINT | (1<<8))
#SQLITE_CONSTRAINT_COMMITHOOK =(#SQLITE_CONSTRAINT | (2<<8))
#SQLITE_CONSTRAINT_FOREIGNKEY =(#SQLITE_CONSTRAINT | (3<<8))
#SQLITE_CONSTRAINT_FUNCTION =(#SQLITE_CONSTRAINT | (4<<8))
#SQLITE_CONSTRAINT_NOTNULL =(#SQLITE_CONSTRAINT | (5<<8))
#SQLITE_CONSTRAINT_PRIMARYKEY =(#SQLITE_CONSTRAINT | (6<<8))
#SQLITE_CONSTRAINT_TRIGGER =(#SQLITE_CONSTRAINT | (7<<8))
#SQLITE_CONSTRAINT_UNIQUE =(#SQLITE_CONSTRAINT | (8<<8))
#SQLITE_CONSTRAINT_VTAB =(#SQLITE_CONSTRAINT | (9<<8))
#SQLITE_NOTICE_RECOVER_WAL =(#SQLITE_NOTICE | (1<<8))
#SQLITE_NOTICE_RECOVER_ROLLBACK =(#SQLITE_NOTICE | (2<<8))
Procedure.s SQLite_ExtendedErrMsg(ExtErrCode.i)
Protected ErrMsg.s
Select ExtErrCode
Case #SQLITE_IOERR_READ
ErrMsg="SQLITE_IOERR_READ"
Case #SQLITE_IOERR_SHORT_READ
ErrMsg="SQLITE_IOERR_SHORT_READ"
Case #SQLITE_IOERR_WRITE
ErrMsg="SQLITE_IOERR_WRITE"
Case #SQLITE_IOERR_FSYNC
ErrMsg="SQLITE_IOERR_FSYNC"
Case #SQLITE_IOERR_DIR_FSYNC
ErrMsg="SQLITE_IOERR_DIR_FSYNC"
Case #SQLITE_IOERR_TRUNCATE
ErrMsg="SQLITE_IOERR_TRUNCATE"
Case #SQLITE_IOERR_FSTAT
ErrMsg="SQLITE_IOERR_FSTAT"
Case #SQLITE_IOERR_UNLOCK
ErrMsg="SQLITE_IOERR_UNLOCK"
Case #SQLITE_IOERR_RDLOCK
ErrMsg="SQLITE_IOERR_RDLOCK"
Case #SQLITE_IOERR_DELETE
ErrMsg="SQLITE_IOERR_DELETE"
Case #SQLITE_IOERR_BLOCKED
ErrMsg="SQLITE_IOERR_BLOCKED"
Case #SQLITE_IOERR_NOMEM
ErrMsg="SQLITE_IOERR_NOMEM"
Case #SQLITE_IOERR_ACCESS
ErrMsg="SQLITE_IOERR_ACCESS"
Case #SQLITE_IOERR_CHECKRESERVEDLOCK
ErrMsg="SQLITE_IOERR_CHECKRESERVEDLOCK"
Case #SQLITE_IOERR_LOCK
ErrMsg="SQLITE_IOERR_LOCK"
Case #SQLITE_IOERR_CLOSE
ErrMsg="SQLITE_IOERR_CLOSE"
Case #SQLITE_IOERR_DIR_CLOSE
ErrMsg="SQLITE_IOERR_DIR_CLOSE"
Case #SQLITE_IOERR_SHMOPEN
ErrMsg="SQLITE_IOERR_SHMOPEN"
Case #SQLITE_IOERR_SHMSIZE
ErrMsg="SQLITE_IOERR_SHMSIZE"
Case #SQLITE_IOERR_SHMLOCK
ErrMsg="SQLITE_IOERR_SHMLOCK"
Case #SQLITE_IOERR_SHMMAP
ErrMsg="SQLITE_IOERR_SHMMAP"
Case #SQLITE_IOERR_SEEK
ErrMsg="SQLITE_IOERR_SEEK"
Case #SQLITE_IOERR_DELETE_NOENT
ErrMsg="SQLITE_IOERR_DELETE_NOENT"
Case #SQLITE_IOERR_MMAP
ErrMsg="SQLITE_IOERR_MMAP"
Case #SQLITE_LOCKED_SHAREDCACHE
ErrMsg="SQLITE_LOCKED_SHAREDCACHE"
Case #SQLITE_BUSY_RECOVERY
ErrMsg="SQLITE_BUSY_RECOVERY"
Case #SQLITE_CANTOPEN_NOTEMPDIR
ErrMsg="SQLITE_CANTOPEN_NOTEMPDIR"
Case #SQLITE_CANTOPEN_ISDIR
ErrMsg="SQLITE_CANTOPEN_ISDIR"
Case #SQLITE_CANTOPEN_FULLPATH
ErrMsg="SQLITE_CANTOPEN_FULLPATH"
Case #SQLITE_CORRUPT_VTAB
ErrMsg="SQLITE_CORRUPT_VTAB"
Case #SQLITE_READONLY_RECOVERY
ErrMsg="SQLITE_READONLY_RECOVERY"
Case #SQLITE_READONLY_CANTLOCK
ErrMsg="SQLITE_READONLY_CANTLOCK"
Case #SQLITE_READONLY_ROLLBACK
ErrMsg="SQLITE_READONLY_ROLLBACK"
Case #SQLITE_ABORT_ROLLBACK
ErrMsg="SQLITE_ABORT_ROLLBACK"
Case #SQLITE_CONSTRAINT_CHECK
ErrMsg="SQLITE_CONSTRAINT_CHECK"
Case #SQLITE_CONSTRAINT_COMMITHOOK
ErrMsg="SQLITE_CONSTRAINT_COMMITHOOK"
Case #SQLITE_CONSTRAINT_FOREIGNKEY
ErrMsg="SQLITE_CONSTRAINT_FOREIGNKEY"
Case #SQLITE_CONSTRAINT_FUNCTION
ErrMsg="SQLITE_CONSTRAINT_FUNCTION"
Case #SQLITE_CONSTRAINT_NOTNULL
ErrMsg="SQLITE_CONSTRAINT_NOTNULL"
Case #SQLITE_CONSTRAINT_PRIMARYKEY
ErrMsg="SQLITE_CONSTRAINT_PRIMARYKEY"
Case #SQLITE_CONSTRAINT_TRIGGER
ErrMsg="SQLITE_CONSTRAINT_TRIGGER"
Case #SQLITE_CONSTRAINT_UNIQUE
ErrMsg="SQLITE_CONSTRAINT_UNIQUE"
Case #SQLITE_CONSTRAINT_VTAB
ErrMsg="SQLITE_CONSTRAINT_VTAB"
Case #SQLITE_NOTICE_RECOVER_WAL
ErrMsg="SQLITE_NOTICE_RECOVER_WAL"
Case #SQLITE_NOTICE_RECOVER_ROLLBACK
ErrMsg="SQLITE_NOTICE_RECOVER_ROLLBACK"
Default
ErrMsg=PeekS(sqlite3_errstr(ExtErrCode), -1, #PB_UTF8)
EndSelect
ErrMsg+" ("+Str(ExtErrCode)+")"
ProcedureReturn ErrMsg
EndProcedure
Procedure.i DatabaseErrorNr(hDB.i, ExtendedCode.b=#False)
If Not ExtendedCode
ProcedureReturn sqlite3_errcode(DatabaseID(hDB))
Else
ProcedureReturn sqlite3_extended_errcode(DatabaseID(hDB))
EndIf
EndProcedure
Procedure.s DatabaseErrorMsg(hDB.i, ExtendedMsg.b=#True)
If ExtendedMsg
ProcedureReturn PeekS(sqlite3_errmsg(DatabaseID(hDB)), -1, #PB_UTF8)+" ("+Str(DatabaseErrorNr(hDB))+") Extended: "+SQLite_ExtendedErrMsg(sqlite3_extended_errcode(DatabaseID(hDB)))
Else
ProcedureReturn PeekS(sqlite3_errmsg(DatabaseID(hDB)), -1, #PB_UTF8)+" ("+Str(DatabaseErrorNr(hDB))+")"
EndIf
EndProcedure
;- END SQLite ResultMessageArea
Procedure DbTest_Disconnect(DB_File.s)
Protected sSql.s
Protected start.i
Protected endtime.i
Protected iCnt.i
If OpenDatabase(#DB, DB_File, "", "")
For iCnt=0 To 10
If IsDatabase(#DB)
Debug "DbReadyToUse >"+Str(iCnt)+"<"
Else
Debug "DbNotReady >"+Str(iCnt)+"<"
EndIf
Delay(500)
Next
sSql="Select * from test"
If DatabaseQuery(#DB, sSql)
iCnt=0
start=ElapsedMilliseconds()
While NextDatabaseRow(#DB) ;alle Einträge abrufen
iCnt+1
Wend
endtime=ElapsedMilliseconds()
Debug "DURATION >"+StrF( (endtime-start)/1000, 3)+"< Count >"+Str(iCnt)+"<"
FinishDatabaseQuery(#DB)
Else
Debug "DB Query Error - Msg >"+DatabaseErrorMsg(#DB)+"< Code >"+Str(DatabaseErrorNr(#DB))+"< ExtendedCode >"+Str(DatabaseErrorNr(#DB, #True))+"<"
EndIf
CloseDatabase(#DB)
Else
Debug "DB error"
EndIf
EndProcedure
Procedure CreateDbFile(DB_File.s)
Protected iHdl.i
Protected sSql.s
Protected Cnt.i
Protected Thread.i
If (FileSize(DB_File)>=0)
ProcedureReturn ; usually we don't want to create a new db each time
DeleteFile(DB_File)
Debug "OldDatabaseDeleted"
EndIf
iHdl=CreateFile(#PB_Any, DB_File)
If (iHdl)
Debug "Created new database-file >"+DB_File+"<"
CloseFile(iHdl)
EndIf
If OpenDatabase(#DB, DB_File, "", "")
sSql="begin; CREATE TABLE test (prkey INTEGER PRIMARY KEY, name TEXT, value TEXT); "
If Not DatabaseUpdate(#DB, sSql)
Debug "Error! >"+sSql+"<"
EndIf
For Cnt=1 To 10
sSql="INSERT INTO test(name, value) VALUES('TestEntry"+RSet(Str(Cnt), 6, "0")+"', '"+Str(Random(99999, 0))+"');"
If Not DatabaseUpdate(#DB, sSql)
Debug "Error! >"+sSql+"<"
EndIf
Next
sSql="commit; "
If Not DatabaseUpdate(#DB, sSql)
Debug "Error! >"+sSql+"<"
Debug "DB Query Error - Msg >"+DatabaseErrorMsg(#DB)+"< Code >"+Str(DatabaseErrorNr(#DB))+"< ExtendedCode >"+Str(DatabaseErrorNr(#DB, #True))+"<"
EndIf
CloseDatabase(#DB)
Else
Debug "db error"
EndIf
EndProcedure
UseSQLiteDatabase()
Define DB_File.s=""
; USB Stick
DB_File="h:\DbTest.sqlite"
; DB_File="h:\test.png"
CreateDbFile(DB_File)
DbTest_Disconnect(DB_File)
Debug "end"
You can try to set DB_File for example to a file that is not a database (I tried it with a picture) - in this case you get the message:
DB Query Error - Msg >file is encrypted or is not a database (26) Extended: file is encrypted or is not a database (26)< Code >26< ExtendedCode >26<
Or use a USB Stick and remove it during the 'IsDatabase' Loop - you'll get another error message:
DB Query Error - Msg >disk I/O error (10) Extended: SQLITE_IOERR_FSTAT (1802)< Code >10< ExtendedCode >1802<
Hope this helps!