我正在研究一个基于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()
应该提供未完成的陈述是错误的吗?我应该做些什么来确保我的陈述能够以这种方式清理?
答案 0 :(得分:4)
在最终确定后,您不应相信stmt
包含任何有意义的内容(即使是sqlite3_next_stmt()
)。
相反:
while (stmt = sqlite3_next_stmt(db, NULL))
{
sqlite3_finalize(stmt);
}