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

Gil*_*aor 11 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
Run Code Online (Sandbox Code Playgroud)

编辑:正如费迪南德在下面所述,上面查询中的问题是?周围的引号.但是,对于将来,我仍然想知道如何检查sqlite3_stmt以查找将要执行的实际查询.

Fer*_*yer 6

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

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

"SELECT * FROM foo WHERE name = ?"
Run Code Online (Sandbox Code Playgroud)

否则SQLite不会替换问号,但会将其视为字符串"?".


小智 1

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

另外,丢失 SELECT 末尾的分号。