2016-12-01 21 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

相关问题