从SQLite中的预准备语句中获取原始SQL查询

Isa*_*avo 7 c++ sqlite

我正在使用来自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);
}
Run Code Online (Sandbox Code Playgroud)

奖励点如果它还可以打印出绑定的实际参数.:)

Vij*_*hew 3

根据 sqlite3.c(合并)中的注释,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);
}
Run Code Online (Sandbox Code Playgroud)

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