我目前正在与一个问题作斗争,在我看来这是一种倒退,因为我以前从未经历过。
下面的程序支持创建一个SQLite3数据库,一个名为sample
的新表,并用单行填充它。
#include <sqlite3.h>
#include <stdio.h>
int main() {
int rc;
sqlite3_stmt* stmt;
sqlite3* db;
rc = sqlite3_open("/tmp/test_second.db", &db);
if (rc) {
printf("Failed to open sqlite3 database: %s\n", sqlite3_errmsg(db));
return 1;
}
rc = sqlite3_prepare_v2(db, "CREATE TABLE sample (anum INTEGER PRIMARY KEY); ", -1, &stmt, NULL);
if (rc != SQLITE_OK) {
printf("Failed to create table: %s\n", sqlite3_errmsg(db));
return 1;
}
sqlite3_finalize(stmt);
rc = sqlite3_prepare_v2(db, "INSERT INTO sample (anum) VALUES (0); ", -1, &stmt, NULL);
if (rc != SQLITE_OK) {
printf("Failed to insert row: %s\n", sqlite3_errmsg(db));
return 1;
}
sqlite3_finalize(stmt);
sqlite3_close(db);
return 0;
}
我是在两种不同的环境下编译的:CentOS 7.9,GCC 4.8.5和SQLite 3.7.17,以及Ubuntu 20.04.5 LTS,GCC 9.4.0,SQLite 3.31.1。
在这两种环境中,编译和运行该程序都会出现以下错误:
Failed to insert row: no such table: sample
数据库是一个零长度的文件,其中没有表。但是,将这些SQL语句直接粘贴到一个sqlite3外壳中可以完美地工作。代码出了什么问题?
1条答案
按热度按时间fruv7luv1#
您只是准备要运行的语句,而不是使用
sqlite3_step()
函数运行它们。该流程写在SQLite C接口文档的简介中。
对于您的两个静态SQL语句,方便的 Package 器
sqlite3_exec()
可以很好地工作: