【问题标题】:Get original SQL query from prepared statement in SQLite从 SQLite 中的准备语句获取原始 SQL 查询
【发布时间】:2021-02-21 00:25:00
【问题描述】:

我正在使用来自 C++ 应用程序的 SQLite (3.6.4)(使用标准 C api)。我的问题是:一旦准备好查询,使用sqlite3_prepare_v2(),并使用sqlite3_bind_xyz() 绑定参数 - 有没有办法获取包含原始 SQL 查询的字符串?

原因是当出现问题时,我想打印查询(用于调试 - 这是一个仅限内部开发人员测试的应用程序)。

例子:

sqlite3_prepare_v2(db, "SELECT * FROM xyz WHERE something = ? AND somethingelse = ?", -1, &myQuery, NULL);
sqlite3_bind_text(myQuery, 1, mySomething);
sqlite3_bind_text(myQuery, 2, mySomethingElse);
// ....

// somewhere else, in another function perhaps
if (sqlite3_step(myQuery) != SQLITE_OK)
{
     // Here i'd like to print the actual query that failed - but I 
     // only have the myQuery variable
     exit(-1);
}

如果它还可以打印出绑定的实际参数,则可以加分。 :)

【问题讨论】:

    标签: c++ sqlite


    【解决方案1】:

    你可能想使用 sqlite3_trace

    这将调用一个回调函数(由您定义),参数中的一个是准备好的语句(包括绑定参数)的 SQL 的 char *。

    【讨论】:

      【解决方案2】:

      根据 sqlite3.c(合并)中的 cmets,sqlite3_sql(myQuery) 将返回原始 SQL 文本。

      我没有看到任何用于查找绑定在特定索引处的值的函数,但我们可以轻松地将一个函数添加到标准 SQLite 函数集。它可能看起来像这样:

      const char* sqlite3_bound_value(sqlite3_stmt* pStmt, int index)
      {
        Vdbe *p = (Vdbe *)pStmt;
      
        // check if &p->aVar[index - 1] points to a valid location.
        return (char*)sqlite3ValueText(&p->aVar[index - 1], SQLITE_UTF8);
      }
      

      好吧,上面的代码只显示了 sqlite3_bound_value() 的一种可能实现方式。我没有测试它,它可能是错误的,但它给出了一些关于如何/从哪里开始的提示。

      【讨论】:

      • 这是尽可能不做太多破解的可能。我接受,因为似乎没有合适的方法来做我最初想做的事情。
      【解决方案3】:

      引用文档:

      在“v2”接口中,返回的准备好的语句(sqlite_stmt 对象)包含原始 SQL 文本的副本。

      http://www.sqlite.org/c3ref/prepare.html

      【讨论】:

        猜你喜欢
        • 2010-09-17
        • 2016-09-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多