Ads 468x60px

##EasyReadMore##

19 8月, 2016

sqlite3_prepare_v2 依版本需搭配 sqlite3_reset 的使用

int sqlite3_step(sqlite3_stmt*);
返回值
函數的返回值基於創建sqlite3_stmt參數所使用的函數,假如是使用老版本的接口sqlite3_prepare()和sqlite3_prepare16(),返回值會是 SQLITE_BUSY, SQLITE_DONE, SQLITE_ROW, SQLITE_ERROR 或 SQLITE_MISUSE,而v2版本的接口sqlite3_prepare_v2()和sqlite3_prepare16_v2()則會同時返回這些結果碼和擴展結果碼。
對所有V3.6.23.1以及其前面的所有版本,需要在sqlite3_step()之後調用sqlite3_reset(),在後續的sqlite3_ step之前。如果調用sqlite3_reset重置準備語句失敗,將會導致sqlite3_ step返回SQLITE_MISUSE,但是在V3. 6.23.1以後,sqlite3_step()將會自動調用sqlite3_reset。

  1. /* create a statement from an SQL string */  
  2. sqlite3_stmt *stmt = NULL;  
  3. sqlite3_prepare_v2( db, sql_str, sql_str_len, &stmt, NULL );  
  4.   
  5. /* use the statement as many times as required */  
  6. while( ... )  
  7. {  
  8.     /* bind any parameter values */  
  9.     sqlite3_bind_xxx( stmt, param_idx, param_value... );  
  10.     ...  
  11.     /* execute statement and step over each row of the result set */  
  12.     while ( sqlite3_step( stmt ) == SQLITE_ROW )  
  13.     {  
  14.         /* extract column values from the current result row */  
  15.         col_val = sqlite3_column_xxx( stmt, col_index );  
  16.         ...  
  17.     }  
  18.   
  19.     /* reset the statement so it may be used again */  
  20.     sqlite3_reset( stmt );  
  21.     sqlite3_clear_bindings( stmt );  /* optional */  
  22. }  
  23.   
  24. /* destroy and release the statement */  
  25. sqlite3_finalize( stmt );  
  26. stmt = NULL;  

這段程序首先調用sqlite3_prepare_v2函數,將一個SQL命令字符串轉換成一條prepared語句,存儲在sqlite3_stmt類型結構體中。隨後調用sqlite3_bind_xxx函數給這條prepared語句綁定參數。然後不停的調用sqlite3_step函數執行這條prepared語句,獲取結果集中的每一行數據,從每一行數據中調用qlite3_column_xxx函數獲取有用的列數據,直到結果集中所有的行都被處理完畢。

prepared語句可以被重置(調用sqlite3_reset函數),然後可以重新綁定參數之後重新執行。sqlite3_prepare_v2函數代價昂貴,所以通常盡可能的重用prepared語句。最後,這條prepared語句確實不在使用時,調用sqlite3_finalize函數釋放所有的內部資源和sqlite3_stmt數據結構,有效刪除prepared語句。


參考:

sqlite3使用简介 - 小柯的博客 - 博客频道 - CSDN.NET - http://goo.gl/d6bhJv

SQlite数据库的C编程接口(三) 预处理语句(Prepared Statements) ——《Using SQlite》读书笔记 . - 斜风细雨 - 博客频道 - CSDN.NET - http://goo.gl/RsuuSo

0 意見:

張貼留言

 
Blogger Templates