此外,DB和注册函数的sqlite_master表似乎仍然可用。这只是stmt访问内存的情况还没有被覆盖,或者是否准备将详细信息写入stmt,这意味着它随后不需要sqlite3 *结构。
#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 :(得分:0)
如果数据库连接与未完成的预准备语句相关联......那么sqlite3_close()将使数据库连接保持打开状态并返回SQLITE_BUSY。如果使用未完成的预准备语句调用sqlite3_close_v2(),则数据库连接将变为不可用的" zombie"当最后一个准备好的语句完成或最后一个sqlite3_backup完成时,它将自动被释放。 sqlite3_close_v2()接口旨在与垃圾收集的主机语言一起使用,并且调用析构函数的顺序是任意的。
但你没有使用这种语言。 你不应该试图访问僵尸;你的申请
应该在尝试关闭对象之前完成与sqlite3对象关联的所有准备好的语句。