SQLite3代码创建表后插入失败,提示表不存在问题求助
SQLite3 C程序无法创建表并插入数据的问题解决
你的代码核心错误是:只完成了SQL语句的编译准备,却没有实际执行这些语句。
sqlite3_prepare_v2()函数仅负责把SQL字符串编译成可执行的语句对象(sqlite3_stmt),并不会自动运行这条SQL。不管是创建表的CREATE TABLE还是插入数据的INSERT,都必须调用sqlite3_step()来触发执行,之后再用sqlite3_finalize()释放资源。
修正后的代码如下:
#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; } // 创建表:prepare后执行step 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; } rc = sqlite3_step(stmt); if (rc != SQLITE_DONE && rc != SQLITE_ROW) { // CREATE语句执行完返回SQLITE_DONE printf("Failed to execute create table: %s\n", sqlite3_errmsg(db)); sqlite3_finalize(stmt); sqlite3_close(db); return 1; } sqlite3_finalize(stmt); // 插入数据:同样需要step执行 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)); sqlite3_close(db); return 1; } rc = sqlite3_step(stmt); if (rc != SQLITE_DONE) { // INSERT执行完返回SQLITE_DONE printf("Failed to execute insert: %s\n", sqlite3_errmsg(db)); sqlite3_finalize(stmt); sqlite3_close(db); return 1; } sqlite3_finalize(stmt); // 关闭数据库前检查状态 rc = sqlite3_close(db); if (rc != SQLITE_OK) { printf("Failed to close database: %s\n", sqlite3_errmsg(db)); return 1; } return 0; }
补充说明:
sqlite3_step()的返回值需要判断:对于无结果集的语句(如CREATE、INSERT),执行成功会返回SQLITE_DONE;对于查询类语句(如SELECT),成功会先返回SQLITE_ROW表示有结果行,结果读完后返回SQLITE_DONE。- 为什么sqlite3 Shell里可以正常执行?因为Shell会自动完成「准备+执行+清理」的完整流程,而C API需要手动调用每一步。
内容的提问来源于stack exchange,提问作者Zenul_Abidin
相关产品推荐
相关产品推荐

