为什么sqlite3_next_stmt()不迭代所有语句?

时间:2014-08-20 17:24:23

标签: c sqlite

我正在研究一个基于SQLite [3.6.20]的C库,我遇到了一个我不理解的行为。当关闭数据库连接时,我执行抢先回滚,然后我尝试使用sqlite3_next_stmt()迭代所有未完成的预准备语句并最终确定它们:

sqlite3_stmt *stmt;

for (stmt = sqlite3_next_stmt(db, NULL);
        stmt;
        stmt = sqlite3_next_stmt(db, stmt)) {
    sqlite3_finalize(stmt);
}

这确实会迭代几个语句,并且通过一些小的工具我可以确认sqlite3_finalize()为每个语句返回SQLITE_OK

然而,在某些测试用例中,当我此后尝试关闭数据库时,我得到SQLITE_BUSY(代码5),其中包含有未完成语句的解释。事实上,如果在那时我再次调用sqlite3_next_stmt(),它会返回一个我的程序可能已准备好的语句,但不是sqlite3_next_stmt()之前返回的语句。

那么,我认为第一遍sqlite3_next_stmt()应该提供未完成的陈述是错误的吗?我应该做些什么来确保我的陈述能够以这种方式清理?

1 个答案:

答案 0 :(得分:4)

在最终确定后,您不应相信stmt包含任何有意义的内容(即使是sqlite3_next_stmt())。

相反:

while (stmt = sqlite3_next_stmt(db, NULL)) 
{
  sqlite3_finalize(stmt); 
}