Sqlite3未将表创建写入数据库

1bqhqjot  于 2022-11-15  发布在  SQLite
关注(0)|答案(1)|浏览(229)

我目前正在与一个问题作斗争,在我看来这是一种倒退,因为我以前从未经历过。
下面的程序支持创建一个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外壳中可以完美地工作。代码出了什么问题?

fruv7luv

fruv7luv1#

您只是准备要运行的语句,而不是使用sqlite3_step()函数运行它们。
该流程写在SQLite C接口文档的简介中。
对于您的两个静态SQL语句,方便的 Package 器sqlite3_exec()可以很好地工作:

#include <sqlite3.h>
#include <stdio.h>

int main() {
  int rc = 0;
  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_exec(db, "CREATE TABLE sample (anum INTEGER PRIMARY KEY); ", NULL, NULL, NULL);
  if (rc != SQLITE_OK) {
    printf("Failed to create table: %s\n", sqlite3_errmsg(db));
    return 1;
  }

  rc = sqlite3_exec(db, "INSERT INTO sample (anum) VALUES (0); ", NULL, NULL, NULL);
  if (rc != SQLITE_OK) {
    printf("Failed to insert row: %s\n", sqlite3_errmsg(db));
    return 1;
  }
  sqlite3_close(db);

  return 0;
}

相关问题