Tbank you in anticipation for any forthcoming advice
I include my program below in Powerbasic (not disimilar to C)
and wonder what I need to do in order to "wrap"
multiple statements (which use prepare,step & finalise) as transactions?
#COMPILE EXE
#DIM ALL
#INCLUDE "sqlite3.inc" 'created 09 May 2013, 15:34:42
GLOBAL ghDb AS DWORD
GLOBAL gDBOPEN AS LONG
SUB Open_Database (fl_nm AS ASCIZ * 512, hd AS DWORD )
IF gDBOPEN = 1 THEN
sqlite3_close(ghDb)
END IF
IF sqlite3_open(fl_nm, BYREF ghDb) <> %SQLITE_OK THEN
? "can't open database",,"error"
gDBOPEN = 0
EXIT SUB
END IF
gDBOPEN = 1
END SUB
FUNCTION exec_sql( _
hDB AS DWORD, _
hD AS DWORD, _
BYVAL pzSql AS ASCIZ PTR, _
BYVAL pzErr_msg AS ASCIZ PTR _
) AS LONG
LOCAL lresult AS LONG
LOCAL pzTail AS ASCIZ PTR
LOCAL pzPrepared AS ASCIZ PTR
LOCAL pzStmt AS ASCIZ PTR
LOCAL azcols() AS ASCIZ PTR ' array of dword pointers to
column name strings
LOCAL azvals() AS ASCIZ PTR ' array of dword pointers to
column values
LOCAL ncols AS LONG ' the column count
LOCAL nErmsg AS LONG
LOCAL szErmsg AS ASCIZ * 512
LOCAL nRetry AS LONG
LOCAL s AS STRING
LOCAL i, l AS LONG
lresult = %SQLITE_OK
IF @pzSql = "" THEN
FUNCTION = %SQLITE_OK
EXIT FUNCTION ' called with null SQL statement
END IF
lresult = sqlite3_prepare( hDB, @pzSql, -1, pzPrepared, pzTail )
IF lresult <> %SQLITE_OK THEN
GOTO finish
END IF
IF pzPrepared = 0 THEN
GOTO finish
END IF
ncols = sqlite3_column_count(pzPrepared)
REDIM azcols(0 TO ncols-1)
FOR i = 0 TO ncols -1
azcols(i) = sqlite3_column_name(pzPrepared, i)
? @azcols(i),,"col heading"
NEXT
REDIM azvals(0 TO ncols-1)
DO WHILE 1
lresult = sqlite3_step(pzPrepared)
s = ""
SELECT CASE lresult
CASE %SQLITE_ROW
FOR i = 0 TO ncols - 1
azvals(i) = sqlite3_column_text(pzPrepared, i)
s = s + @azvals(i) + ","
NEXT
? s,,"row"
CASE %SQLITE_DONE
GOTO Finish
CASE ELSE
? "unexpected result = " + STR$(lresult)
GOTO finish
END SELECT
LOOP
Finish:
IF pzPrepared <> 0 THEN
sqlite3_finalize(pzPrepared)
END IF
IF lresult <> %SQLITE_OK THEN
lresult = sqlite3_errcode(hDB)
pzErr_msg = sqlite3_errmsg(hDB)
END IF
FUNCTION = lresult
END FUNCTION
FUNCTION PBMAIN()
LOCAL sSQL AS STRING
LOCAL pzErr_msg AS ASCIZ PTR
'I don't seem to be able to make transactions work
'ie I was expecting to see a msgbox for each data row inserted
'but I don't
sSQL = "begin transaction;" + $CRLF + _
"create table if not exists membership (member, date,
annualsubs, payments);" + $CRLF + _
"insert into membership values ('Fred', '10-APR-2010', 123,
54);" + $CRLF + _
"insert into membership values ('James', '10-APR-2010', 123,
0);" + $CRLF + _
"insert into membership values ('Molly', '10-MAY-2010', 123,
0);" + $CRLF + _
"insert into membership values ('Angus', '10-APR-2010', 90,
10);" + $CRLF + _
"insert into membership values ('Patrick', '10-JUN-2010', 123,
0);" + $CRLF + _
"select member, date ""date due"", annualsubs - payments
""amount due"" from membership;" + _
"commit transaction;"
open_database("test1.db",ghDb)
sSQL = "create table if not exists membership (member, date,
annualsubs, payments);"
exec_sql( ghDb, ghDb, BYVAL STRPTR(sSQL), pzErr_msg )
'no this doesn't seem to work either
' sSQL = "begin transaction; " & "insert into membership values
('Fred', '10-APR-2010', 123, 54);" & " commit transaction;"
'if I replace the above line with this one...it's fine
'I don't understand what it is that's missing to make transactions work
'btw...this replacement line works fine
sSQL = "insert into membership values ('Fred', '10-APR-2010', 123,
54);"
exec_sql( ghDb, ghDb, BYVAL STRPTR(sSQL), pzErr_msg )
sSQL = "select member, date ""date due"", annualsubs - payments
""amount due"" from membership;"
exec_sql( ghDb, ghDb, BYVAL STRPTR(sSQL), pzErr_msg )
sqlite3_free(BYVAL pzErr_msg)
sqlite3_close(ghDb)
END FUNCTION
_______________________________________________
sqlite-users mailing list
[email protected]
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users