【发布时间】:2020-04-14 16:34:51
【问题描述】:
我正在学习如何在 c++ 中使用 sqlite3 库,到目前为止,我成功地执行了 SELECT 查询并创建了新表,但似乎更新/插入不起作用:
作为模拟测试,我使用的是静态查询(不使用变量):
int rc {0};
char *zErrMsg {0};
sql = "UPDATE tag_list set name = 'foo' where ID=16; " \
"SELECT * from tag_list";
rc = sqlite3_exec(this->db_ptr, sql, callback, (void*)data, &zErrMsg);
if( rc != SQLITE_OK ) {
fprintf(stderr, "SQL error: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
} else {
fprintf(stdout, "Operation done successfully\n");
}
我的回调函数是:
static int callback(void *data, int argc, char **argv, char **azColName){
int i;
fprintf(stderr, "%s: ", (const char*)data);
for(i = 0; i<argc; i++) {
printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
}
printf("\n");
return 0;
}
输出:
id = 14
name = computer
last_update = 123
id = 16
name = foo
last_update = 1
Operation done successfully
当我直接查询数据库时,这是我得到的:
╔════╦══════════╦═════════════╗
║ ID ║ name ║ Last_update ║
╠════╬══════════╬═════════════╣
║ 14 ║ computer ║ 123 ║
║ 16 ║ s ║ 1 ║
╚════╩══════════╩═════════════╝
我使用 sqlite3_get_autocommit 检查并返回 1,据我了解,这意味着它正在自动提交。
我可以从外部更新行,它只发生在代码中。
tl;dr:我正在尝试更新我创建的表中的名称,但似乎没有提交更改。
我希望有更多经验的人以前遇到过这个并且知道如何绕过这个。
【问题讨论】:
-
你试过了吗:stackoverflow.com/questions/2880149/… (
BEGIN TRANSACTION,END TRANSACTION) -
是的,很遗憾没有帮助
-
您在一个查询中运行两条 SQL 语句。不幸的是,SQLite 不允许这样做。您需要在 two 查询中运行您的 two 语句。您可以在这里查看信息sqlite.org/c3ref/prepare.html