首先要注意控制代碼關聯。其次,開始看關於查詢參數化的內容。
查詢參數化:
API支援在SQL語句中綁定參數,允許在後面為參數提供值,綁定的參數與sqlite3_prepare( ) 一起使用。如果沒有綁定參數,那麼sqlite3_step()預設使用null作為該參數的值。
準備語句過後,將使用sqlite3_bind_xxx( ) 函數綁定參數值。
函數的聲明:sqlite3_bind_xxx(
sqlite3_stmt * , /*語句控制代碼*/
int i, /*參數個數*/
xxx value, /*綁定的值*/
) ;
不同型別參數的綁定聲明:
int sqlite3_bind_xxx(sqlite3_stmt * , int , xxx) ,其中xxx代表int 、double、int64、null、zeroblob 、blob、text、text16,其中前四個用於標量值,後三個用於數組。sqlite3_mprintf()函數自動轉移引號字元的功能在sqlite3_bind_text() 體現出。使用blob變種類型:
int sqlite3_bind_bolb(
sqlite3_stmt * ; /* 語句控制代碼 */
int , /*次序*/
const void * , /*指向blob資料*/
int n , /**資料的位元組長度/
void (*(void * ) ) , /*清除位元組程式*/
) ;
API為清理控制代碼提供的兩個特殊含義的預定義值:
#define SQLITE_STATIC ( (void (*)(void *))0 ) 指示幫頂函數數組記憶體駐留在非託管空間,SQLite不會試圖清理該空間
#define SQLITE_TRANSIENT ( (void (*)(void *))-1) 指示數組記憶體經常變化,SQLite需要自己的資料副本,副本在語句結束是自動清除
清除函數:void cleanup_fn( void *) .如果提供了自動清理函數,在語句結束時會自動調用。
參數綁定完成,sqlite3_step()接受參數幫頂值,替換sql文本,執行語句。
四種參數綁定辦法的不同:就是參數的表示方式(位置參數,顯式定義函數編號,字母數字化的數字名稱)、參數分配編號的方式。
參數編號:允許為參數指定編號,不使用內部給定的序列。參數編號的文法是問號後緊跟一個數字。
比如:insert into table_name values(?num,?num,?num……);其中num的值在1——999之間而且是越小越好,當num一樣,可以節省時間。
參數命名:在指定參數編號的地方給參數綁定一個名稱。給參數編號的方法就是首碼為一個問號,表示命名的參數是在前面加上一個冒號(:)或者加上@符號。
比如:insert into table_name values(:value, : value , @value);sqlite3_prepare()為命名的參數自動分配編號,雖然編號未知,但是可以使用函數sqlite3_bind_parameter_index( )獲得編號。
TCL參數:使用$符號。
錯誤與異常:
錯誤處理:
API可能返回錯誤的整數結果代碼。比如:sqlite3_open_v2() 、sqlite3_prepare()sqlite3_exec()、sqlite3_bind_xxx()、sqlite3_close() 、sqlite3_create_collation()、sqlite3_collation_needed()、sqlite3_create_function()、sqlite3_finalize()、sqlite3_sqlite3_get_table()、sqlite3_reset()
、sqlite3_step() 等。
擷取錯誤的函數資訊函數:sqlite3_errmsg().
聲明:const char * sqlite3_errmsg(sqlite3 *) ; 語句控制代碼是唯一參數,返回該連結上API調用產生的最近的錯誤,無錯誤才返回“not an error”.
SQLite 結果代碼:《SQLite權威指南》page195.
繁忙情況處理:sqlite3_busy_handler() , sqlite3_busy_timeout( ).注意應急計劃的啟動,設定合理的逾時時間。
模式改變處理:從鎖定的角度來看,模式改變的時間在sqlite3_prepare()調用和sqlite3_step()調用之間。應對的方法就是處理改變重新開始。導致SQLITE_SCHEMA存在的原因:分離資料庫、修改或者安裝使用者自訂的函數或者彙總、修改或者安裝使用者自訂的定序、修改或者安裝授權函數、清理資料庫空間等。這種錯誤情況與VDBE有關。
追蹤SQL:使用函數sqlite3_trace( ) .
函式宣告:void *sqlite3_trace(sqlite* , void(*xTrace)(void * , const char *) , void * );和竊聽器的功能類似。
操作控制:
基本都是監視資料庫的串連和事務的函數。
提交鉤子:sqlite3_commit_hook()監視串連上的事務提交事件。
聲明: void * sqlite_commit_hook(
sqlite * cnx , /*資料庫控制代碼*/
int (*xCallback )(void * data) , /*回呼函數*/
void *data , /*應用程式資料*/
);
復原鉤子:sqlite3_rollback_hook()監視串連上的事務提交事件。
聲明: void * sqlite_rollback_hook(
sqlite * cnx , /*資料庫控制代碼*/
int (*xCallback )(void * data) , /*回呼函數*/
void *data , /*應用程式資料*/
);
注意自動復原無法觸發回呼函數。
更新鉤子:sqlite3_update_hook()監視串連上的事務提交事件。
聲明: void * sqlite_update_hook(
sqlite * cnx , /*資料庫控制代碼*/
int (*xCallback )(void * data) , /*回呼函數*/
void *data , /*應用程式資料*/
);
此時,回呼函數的行式:void callback( void * data, /*更新鉤子的第三個參數*/
int operation_code, /*與sqlite_update、sqlite_insert、sqlite_delete操作對應*/
char const *db_name,
char const *table_name,
sqlite_int64 rowid,
);
授權函數:
事件過濾器:sqlite3_set_authorizer()
聲明: int sqlite3_set_authorizer(
sqlite3 * ,
int (*xAuth)(void *,int ,
const char * , const char * ,
const char * , const char * ,
) ,
void *pUserData;
);
注意:授權函數是存在回呼函數的:
int auth(
void *, /*使用者資料*/
int, /*事件代碼*/
const char *, /*事件具體相關的參數*/
const char *, /*事件具體相關的參數*/
const char *, /*資料庫名稱*/
const char *, /*觸發器或者視圖名稱*/
)
授權函數的傳回值:SQLITE_OK、SQLITE_DENY(終止整個sql語句)、SQLITE_IGNORE。注意互動式程式的協助。page209。