【问题标题】:Re-using sqlite3 statement for new query重新使用 sqlite3 语句进行新查询
【发布时间】:2021-11-03 16:13:06
【问题描述】:

为了在 C++ 中提交一个 sqlite 查询,我们需要创建一个sqlite3_stmt,通过sqlite3_prepare_v2sqlite3_bind_ 潜在值将其准备到语句中,然后通过它sqlite3_step

现在,在一个函数中,例如执行两个单独的 sqlite 查询,我可以通过再次调用 sqlite3_prepare_v2 来重复使用相同的 sqlite3_stmt,还是需要事先明确地 sqlite3_reset 声明?

例如

void mySqliteFunction() {
    sqlite3_stmt* stmt;
    int rc;
    rc = sqlite3_prepare_v2(<connection>, <sql string>, ..., &stmt, ...);
    rc = sqlite3_step(stmt);
    if (rc == SQLITE_OK) {
        rc = sqlite3_prepare_v2(<connection>, <other sql string>, ..., &stmt, ...); // is this valid?
        rc = sqlite3_step(stmt);
    }
    rc = sqlite3_finalize(stmt);
    return;
}

【问题讨论】:

  • 为什么准备一个语句然后立即丢弃它?
  • @jarmod 谢谢,我忘记了伪代码中的step 并相应地更新了我的问题。你现在明白我的意思了吗?

标签: c++ sqlite


【解决方案1】:

代码中的 stmt 准备好的语句变量只是保存准备好的语句的句柄,其值由 sqlite3_prepare_v2() 调用填充。

当前代码中的问题是您未能正确完成。您负责使用sqlite3_finalize() 删除已编译的SQL 语句。如果您在使用后正确地完成了初始准备语句,那么您可以重用 stmt 变量,否则您正在泄漏资源。

sqlite3_reset() 函数旨在重置给定的预准备语句以允许重新执行。它不适用于实际准备不同 SQL 语句的情况。

【讨论】:

  • 重要的是要注意我不想用它来执行与其他绑定完全相同的语句。第一个&lt;sql string&gt; 可能插入一行,第二个&lt;other sql string&gt; 可能是一个选择查询...
猜你喜欢
  • 1970-01-01
  • 2015-07-01
  • 1970-01-01
  • 2014-03-16
  • 2013-01-16
  • 1970-01-01
  • 1970-01-01
  • 2021-09-12
  • 1970-01-01
相关资源
最近更新 更多