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

时间:2009-09-09 06:50:44

标签: 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);
}

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

3 个答案:

答案 0 :(得分:4)

您可能想要使用sqlite3_trace

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

答案 1 :(得分:3)

根据sqlite3.c(amalgamation)中的注释,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()的可能方法。我没有测试它,它可能是错误的,但它给出了如何/从哪里开始的一些提示。

答案 2 :(得分:1)

引用文档:

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

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