str我有这段代码应该插入到 SQLite3 数据库中,但是我试图绑定(bind)的两列都插入了空白值。我试过只使用 sprintf 将值直接放入 sql 语句中,但这会产生段错误。如果我能在这里得到任何帮助,我将不胜感激。
/* libsensordata.c */
#include <stdio.h>
#include <sqlite3.h>
int insert_data (char *sensor, double temp)
{
sqlite3 *db;
char *err_msg = 0;
sqlite3_stmt *res;
int rc = sqlite3_open("ap.db", &db);
if (rc != SQLITE_OK) {
fprintf(stderr, "Cannot open database: %s\n", sqlite3_errmsg(db));
sqlite3_close(db);
return -1;
}
char *sql = "insert INTO sensordata (sensor, temp, t, processed) values (@sensor,@temp,DateTime('now'),0)";
rc = sqlite3_prepare_v2(db,sql, -1, &res, 0);
if ( rc == SQLITE_OK) {
int idx = sqlite3_bind_parameter_index(res, "@sensor");
sqlite3_bind_text(res,idx,sensor,strlen(sensor),SQLITE_TRANSIENT);
idx = sqlite3_bind_parameter_index(res, "@temp");
sqlite3_bind_double(res,idx,temp);
}
else {
fprintf(stderr, "Failed to execute statement: %s\n", sqlite3_errmsg(db));
sqlite3_close(db);
return -1;
}
rc = sqlite3_exec(db, sql, 0, 0, &err_msg);
if (rc != SQLITE_OK ) {
fprintf(stderr, "SQL error: %s\n", err_msg);
sqlite3_free(err_msg);
sqlite3_close(db);
return -1;
}
sqlite3_close(db);
return 0;
}
/* Test database testdb.c */
#include "libsensordata.h"
int main()
{
insert_data("1234567890123456789012345",-17.0);
return 0;
}
最佳答案
您正在使用 sqlite3_exec它只是执行 SQL 语句
insert INTO
sensordata (sensor, temp, t, processed)
values (@sensor,@temp,DateTime('now'),0)`
在没有任何绑定(bind)值的情况下插入语句(插入空值)。
您需要调用sqlite3_step ,这将执行作为参数传递的准备好的语句(res
在您的代码中)。
你必须替换这一行:
rc = sqlite3_exec(db, sql, 0, 0, &err_msg);
用这个:
rc = sqlite3_step(res);
让您的代码执行所需的插入
关于C - SQLite 绑定(bind)不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29182653/