【问题标题】:sqlite prepared statements - how to debugsqlite 准备好的语句 - 如何调试
【发布时间】:2009-02-24 09:19:02
【问题描述】:

我正在编写一些使用 sqlite3 库的 c++ 代码。我正在使用一个准备好的语句,我在运行时将一个变量绑定到该语句。

我如何检查绑定后语句中的 SQL 查询

例如,下面的代码不返回一行。使用预制字符串和 sqlite3_exec 时,我得到了我期望的结果。

sqlite3_stmt *statement;
const char *query = "SELECT * FROM foo WHERE (name='?');";
sqlite3_prepare_v2(db, query, strlen(query), &statemtnt, NULL);
sqlite3_bind_text(statement, 1, "bar", -1, SQLITE3_STATIC);
int result = sqlite3_step(statement);
// expected: result = SQLITE_ROW
// actual: result = SQLITE_DONE

编辑:正如费迪南德在下面所说,上面查询中的问题是 ? 周围的引号。但是,对于将来,我仍然想知道如何检查 sqlite3_stmt 以了解将要执行的实际查询。

【问题讨论】:

    标签: c++ sqlite


    【解决方案1】:

    绑定后 SQL 查询不会改变 -- 您的变量不会插入到 SQL 字符串或任何东西中。

    除了 Neil 所说的,去掉 ? 周围的引号。占位符:

    "SELECT * FROM foo WHERE name = ?"
    

    否则 SQLite 不会替换问号,而是将其视为字符串“?”。

    【讨论】:

    • 谢谢,问题确实是 ? 周围的引号。
    • 我知道 sql 字符串不会改变(毕竟我声明它为 const)。但是,声明发生了变化。有什么方法可以通过查看语句来查看绑定后哪些查询将进入数据库?
    • 你的意思是要检查SQLite生成的解析树?如果不深入研究 SQLite 源代码,我认为您无法做到这一点...
    【解决方案2】:

    是的,您可以通过像这样定义配置文件函数来做到这一点:

    static void profile(void *context, const char *sql, sqlite3_uint64 ns) {
    fprintf(stderr, "Query: %s\n", sql);
    fprintf(stderr, "Execution Time: %llu ms\n", ns / 1000000);}
    

    然后在您使用 sqlite3_open 打开数据库后,立即调用:

    sqlite3_profile(fDBLink, &profile, NULL);
    

    【讨论】:

    • 我刚试过这个;它没有显示 op 似乎希望的绑定结果。
    • 好建议,但不显示绑定参数
    • 已弃用,请参阅SQL Trace Hook
    【解决方案3】:

    sqlite3_bind_text 的第三个参数应该是您要绑定的值 - 在您的代码中您试图将查询绑定到自身!

    另外,在 SELECT 末尾丢失分号。

    【讨论】:

    • 抱歉,写这个问题时有一个错字。所以,不,这不是真正的问题,抱歉
    • 我认为分号是必需的
    【解决方案4】:

    不太了解 sqlite,但实际查询可能会被记录,或者您可以拨动开关以使其被记录。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-02
      • 1970-01-01
      • 1970-01-01
      • 2010-09-30
      • 1970-01-01
      相关资源
      最近更新 更多