c-如何完成所有挂起的SELECT语句



"数据库已锁定"的SQLite wiki页面显示:

有时人们认为他们已经完成了SELECT语句,因为sqlite3_step()已经返回了SQLITE_DONE。但是SELECT直到sqlite3_reset()sqlite3_finalize()被调用之后才真正完成。截至签入[3902](2007-05-02版本3.3.17之后),CREATE语句现在允许这样做。

当然,我可以关闭并重新打开数据库,但这会使所有准备好的语句无效。是否存在另一种不需要我跟踪所有挂起的SELECT语句的方法?

当然,我可以关闭并重新打开数据库,但这会使所有准备好的语句无效。是否存在另一种不需要我跟踪所有挂起的SELECT语句的方法?

SQLite已经跟踪了所有准备好的语句,并且它提供了sqlite3_next_stmt()作为一种机制,您可以通过它遍历它的列表。还有sqlite3_stmt_busy(),您可以通过它来测试语句是否保持事务打开,但这并不能帮助您识别已经运行到完成的语句,因此这些语句与活动事务无关,但由于尚未最终确定或重置,仍有数据库资源分配给它们。

这里有一种方法可以重置SQLite当前已知的所有准备好的语句:

    sqlite3 *db = /* ... */
    sqlite3_stmt *stmt;
    /* ensure that there is no open transaction; will fail harmlessly if
       there already is none */
    sqlite3_exec(db, "rollback", NULL, NULL, NULL);
    /* Clean up any outstanding prepared statements */
    for (stmt = sqlite3_next_stmt(db, NULL); stmt; stmt = sqlite3_next_stmt(db, stmt)) {
        int result = sqlite3_reset(stmt);
        /* handle errors ... */
    }

重置不需要它的语句应该是无害的。

话虽如此,您应该跟踪当前运行的语句,并确保在处理完它们所提供的当前结果集后重置它们。这需要一点纪律,但这是正确的做法。

最新更新