2016-12-01 3 views
0

また、DBおよび登録された関数用のsqlite_masterテーブルも使用可能に見えます。これは、まだ上書きされていないstmtにアクセスするstmtのケースか、後でsqlite3 *構造を必要としないことを意味するstmtへの書き込みの詳細を準備します。準備が整いましたが、stmtはまだ動作した後にSQLite DBが閉じられましたか?

#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

ありがとうございます。私はそれを読んでいなかったし、それがSQLITE_OKを返したという事実によって投げられました。 – NoComprende

関連する問題