sqlite准备好的语句 - 如何调试

时间:2009-02-24 09:19:03

标签: c++ sqlite

我正在编写一些使用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以查找将要执行的实际查询。

4 个答案:

答案 0 :(得分:6)

绑定后SQL查询不会更改 - 您的变量未插入SQL字符串或任何内容。

除了Neil所说的,还要在周围放下引号?占位符:

"SELECT * FROM foo WHERE name = ?"

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

答案 1 :(得分:1)

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

此外,在SELECT结束时丢失分号。

答案 2 :(得分:1)

是的,你可以通过定义这样的配置文件函数来实现:

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);

答案 3 :(得分:-1)

不太了解sqlite,但可能会记录实际查询,或者您可以翻转开关以将其记录下来。