我想运行SQL查询:SELECT COUNT(id) AS nbr FROM user WHERE name LIKE '%John%'
,并获取与关键字John
匹配的记录数。
所以我写了以下代码:
unsigned int nbr;
char *sql, *like;
sqlite3 *db;
sqlite3_stmt *stmt;
/* Database connection etc. */
like = _make_string("%%%s%%", keyword); /* keyword: John */
printf("Like clause: %s\n", like);
sql = _make_string("SELECT COUNT(id) AS nbr FROM user WHERE name LIKE ?");
sqlite3_prepare_v2(db, sql, -1, &stmt, NULL);
sqlite3_bind_text(stmt, 1, like, -1, SQLITE_STATIC);
if (sqlite3_step(stmt) != SQLITE_ROW) {
/* error, SQL execution failed */
}
nbr = sqlite3_column_int64(stmt, 1);
printf("Number of record: %u\n", nbr);
/* Free strings, finalize statement, disconnect db etc. */
为简单起见,在代码段中忽略了一些返回值测试。 _make_string(const char *fmt, ...)
是类似printf
的函数,可以形成字符串,并且确实向我返回%John%
。
但是,我的代码总是返回0记录。我在sqlite3
命令行shell中尝试过SQL,但它找到了2条记录。
请问好吗?
我已经对LIKE子句进行了硬编码并删除了sqlite3_bind_text
函数,但它并没有改变结果。
sql = _make_string("SELECT COUNT(id) AS nbr FROM client WHERE name LIKE '%John%'");
sqlite3_prepare_v2(db, sql, -1, &stmt, NULL);
if (sqlite3_step(stmt) != SQLITE_ROW) {
/* error */
}
nbr = sqlite3_column_int64(stmt, 1);
printf("Number of record: %u\n", nbr);
程序总是返回0条记录。
答案 0 :(得分:0)
好吧,我在SQLite Why bind indexes start from 1 and column indexes start from 0?的邮件列表档案中找到了答案
实际上,绑定索引从1开始,但是列索引从0开始。因此代码应该修改如下
nbr = sqlite3_column_int64(stmt, 0);
printf("Number of record: %u.\n", nbr);
现在程序返回2(记录)!