2016-12-01 17 views
0

另外,DB和註冊函數的sqlite_master表仍然可用。這只是stmt訪問內存的一種情況,它尚未被覆蓋,或者準備將詳細信息寫入stmt中,這意味着它不需要sqlite3 *結構。準備好SQLite數據庫之後關閉,但是stmt仍然有效?

#include "sqlite3.h" 
//--------------------------------------------------------------------------- 
void Odd(sqlite3_context *ctx,int nargs,sqlite3_value **values) 
{ 
    sqlite3_result_int(ctx,sqlite3_value_int(values[0])%2); 
} 
//--------------------------------------------------------------------------- 
int _tmain(int argc,_TCHAR* argv[]) 
{ 
    sqlite3 *DB; 
    if (sqlite3_open_v2("c:/SQLiteData/MyDB.db",&DB,SQLITE_OPEN_READWRITE,NULL)!=SQLITE_OK) 
     return 1; 
    sqlite3_create_function_v2(DB,"Odd",-1,SQLITE_UTF16 | SQLITE_DETERMINISTIC,NULL, 
    &Odd,NULL,NULL,NULL); 
    sqlite3_stmt *stmt; 
    if (sqlite3_prepare16_v2(DB,L"select * from sqlite_master where Odd(rowid)", 
    -1,&stmt,NULL)!=SQLITE_OK) return 2; 
    if (sqlite3_close_v2(DB)!=SQLITE_OK) return 3; 
    int Count=0; 
    while (sqlite3_step(stmt)==SQLITE_ROW) Count++; 
    return 0; 
} 

回答

0

documentation說:

如果數據庫連接與未收尾準備語句關聯......然後sqlite3_close()將離開數據庫連接打開,並返回SQLITE_BUSY。如果調用sqlite3_close_v2()時使用未定義的預處理語句...,那麼數據庫連接將變爲不可用的「殭屍」,當最後一個準備好的語句完成或最後一個sqlite3_backup完成時,它將自動解除分配。 sqlite3_close_v2()接口旨在用於垃圾收集的主機語言,以及調用析構函數的順序是任意的。

但是你沒有使用這樣的語言。 你不應該嘗試訪問殭屍;您的應用程序

應該在嘗試關閉對象之前最終確定與sqlite3對象關聯的所有準備好的語句。

+0

謝謝CL。我沒有讀過它,並被返回SQLITE_OK的事實拋出。 – NoComprende

相關問題