我正在编写一些使用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以查找将要执行的实际查询。
答案 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,但可能会记录实际查询,或者您可以翻转开关以将其记录下来。