SQLite DB在准备好之后关闭但是stmt仍然有效吗?

时间:2016-12-01 11:23:29

标签: sqlite

此外,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;
}

1 个答案:

答案 0 :(得分:0)

documentation说:

  

如果数据库连接与未完成的预准备语句相关联......那么sqlite3_close()将使数据库连接保持打开状态并返回SQLITE_BUSY。如果使用未完成的预准备语句调用sqlite3_close_v2(),则数据库连接将变为不可用的" zombie"当最后一个准备好的语句完成或最后一个sqlite3_backup完成时,它将自动被释放。 sqlite3_close_v2()接口旨在与垃圾收集的主机语言一起使用,并且调用析构函数的顺序是任意的。

但你没有使用这种语言。 你不应该试图访问僵尸;你的申请

  

应该在尝试关闭对象之前完成与sqlite3对象关联的所有准备好的语句。