SQLite3-SQL错误:无法识别C的令牌:“”
我知道这已经在中得到了回答,但我不明白我们如何使用“?”来表示使用C的SQLite 我是这样做的-SQLite3-SQL错误:无法识别C的令牌:“”,sql,c,sqlite,Sql,C,Sqlite,我知道这已经在中得到了回答,但我不明白我们如何使用“?”来表示使用C的SQLite 我是这样做的- rc = sqlite3_open("test.db", &db); if(rc) { debug_log("Can't open database: %s\n", sqlite3_errmsg(db));
rc = sqlite3_open("test.db", &db);
if(rc) {
debug_log("Can't open database: %s\n", sqlite3_errmsg(db)); rv = 3;
goto end;
} else {
debug_log("Opened database successfully\n");
}
querylen = strlen("SELECT * from HMAC WHERE path = %s AND checksum = %s;");
pathlen = strlen(path); sql = (char *)malloc(querylen + pathlen + strlen(hex));
sprintf(sql, "SELECT * from HMAC WHERE path = \'%s\' AND checksum = \'%s\';", path, hex);
fprintf(stderr, "%s\n", sql);
/* Execute SQL statement */
rc = sqlite3_exec(db, sql, callback, NULL, &zErrMsg);
if (rc != SQLITE_OK ) {
rv = 3;
fprintf(stderr, "SQL error: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
goto end;
}
if (checksum_matched == 1) {
rv = 0;
} else {
rv = 1;
}
free(sql);
sqlite3_close(db);
但是当我尝试检索一些案例的数据时-
SELECT * from HMAC WHERE path = '/usr/share/monitors/SNMPDCA_monitor' AND checksum = '66ace8fa66362d2cbbd926aac0b47531a7113afca0ab68b6202ecf0a7eaa87a2';
SQL error: unrecognized token: ""
更新:添加有用的内容,供将来遇到相同问题的其他人参考
sqlite3_stmt *stmt;
rc = sqlite3_open("/usr/lib/hmac-binaries/test.db", &db);
if(rc) {
debug_log("Can't open database: %s\n", sqlite3_errmsg(db));
rv = 3;
goto close_conn;
} else {
debug_log("Opened database successfully\n");
}
querylen = strlen("SELECT * from HMAC WHERE path=?;");
sql = (char *)malloc(querylen + 1);
if (sql == NULL) {
fprintf(stderr, "ENOMEM\n");
rv = -1;
goto close_conn;
}
sprintf(sql, "SELECT * from HMAC WHERE path=?;");
rc = sqlite3_prepare_v2(db, sql, -1, &stmt, NULL);
if (rc != SQLITE_OK) {
fprintf(stderr, "error: %s\n", sqlite3_errmsg(db));
rv = 3;
goto close_conn;
} else {
sqlite3_bind_text(stmt, 1, path, -1, NULL);
}
rv = 1;
while ((rc = sqlite3_step(stmt)) == SQLITE_ROW) {
if (strcmp(sqlite3_column_text(stmt, 3), hex) == 0) {
rv = 0;
break;
}
}
if (rv != 0 && rc != SQLITE_DONE) {
rv = 3;
}
sqlite3_finalize(stmt);
close_conn:
if (sql)
free(sql);
sqlite3_close(db);
在SQLite API中有一个问号?用作占位符,该占位符稍后将替换为实际值。这用于创建准备好的语句,如中所述 您文章中的源代码不包含使用预处理语句的示例,因此我将附上一个最简单的示例: 包括 包括 int mainvoid{ sqlite3*db; char*err_msg=0; sqlite3_stmt*res; int rc=sqlite3_opentest.db,&db; 如果rc!=SQLITE\u正常{ fprintfstderr,无法打开数据库:%s\n,sqlite3\u errmsgdb; sqlite3_closedb; 返回1; } //问号用于为SQL查询提供Id。 const char*sql=SELECT Id,Name FROM Cars,其中Id=?; //sqlite3_prepare_v2函数编译SQL查询。 rc=sqlite3\u prepare\u v2db,sql,-1,&res,0; 如果rc==SQLITE\u正常{ //sqlite3_bind_int将整数值绑定到准备好的语句。 //占位符替换为整数值3。函数的第二个 //参数是要设置的SQL参数的索引,第三个是 //parameter是要绑定到参数的值。 sqlite3_bind_intres,1,3; }否则{ fprintfstderr,未能执行语句:%s\n,sqlite3\u errmsgdb; } //sqlite3_步骤函数计算SQL语句。 int step=sqlite3_stepres; 如果步骤==SQLITE\u行{ printf%s:,sqlite3\u column\u textres,0; printf%s\n,sqlite3\u column\u textres,1; } sqlite3_finalizeres; sqlite3_closedb; 返回0; }
我建议您阅读官方和,以了解更多使用预置语句的示例。使用并将您的值绑定到其中的参数。@Shawn您能提供一个示例吗?谢谢您的帮助。我正在把它标记为已批准。