"库例程调用不连续"sqlite3_prepare_v2(CREATE TABLE)

use*_*655 8 sqlite

你知道为什么当我打电话sqlite3_prepare_v2(CREATE TABLE)给一个空的数据库时,我会得到"Library Routine Called Out Of Sequence" 吗?

我创建一个空数据库,然后打开它.后来我保存了所有必须写入RAM中的数据库的信息(我需要将这些信息保存在RAM中并在执行结束时将其刷新到永久存储器中),但是当我调用时会收到此错误消息sqlite3_prepare_v2(CREATE TABLE).它返回"Library Routine Called Out of Sequence"作为错误消息.

我确实正确地打开了我的数据库(我认为这可能是一个问题所以我做了close()我的数据库然后open()在调用之前sqlite3_prepare_v2(CREATE TABLE)).我认为这可能是因为线程并发,但使用临界区也没有帮助.

Mar*_*son 12

这是文档中关于错误原因的说明:

  1. 使用sqlite3*指针调用任何API例程,该指针不是从sqlite3_open()或sqlite3_open16()获得的,或者已由sqlite3_close()关闭.
  2. 尝试在两个或多个线程的同一时刻使用相同的数据库连接.
  3. 使用sqlite3_stmt*语句指针调用sqlite3_step(),该指针未从sqlite3_prepare()或sqlite3_prepare16()获取,或者已被sqlite3_finalize()销毁.
  4. 在该语句运行时尝试将值绑定到语句(使用sqlite3_bind _...()).

你提到尝试一个关键部分,所以我想我们可以排除#2.您的错误是调用sqlite3_prepare_v2(...)而不是sqlite3_step()或sqlite3_bind()的结果,所以我猜这只会留下#1?你能仔细检查你的数据库指针是否正常?将它追溯到返回它的sqlite3_open()并确保在调用prepare之前没有关闭它?

这对我有用:

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

int main(int argc, char **argv){

    sqlite3 *db;
    int rc;

    char *db_name= ":memory:";

    rc = sqlite3_open(db_name, &db);

    if (rc != SQLITE_OK) {
        fprintf(stderr, "failed to open in memory database: %s\n", 
                sqlite3_errmsg(db));
        sqlite3_close(db);
        return(1);
    }

    const char *create_sql = "CREATE TABLE foo(bar TEXT)";
    sqlite3_stmt *statement;

    rc = sqlite3_prepare_v2(db, create_sql, -1, &statement, NULL);

    if (rc != SQLITE_OK) {
        fprintf(stderr, "failed to prepare statement: %s\n",
                sqlite3_errmsg(db));
        sqlite3_close(db);
        return(1);
    }

    rc = sqlite3_step(statement);

    if (rc == SQLITE_ERROR) {
        fprintf(stderr, 
                "failed to execute statement: %s\n", 
                sqlite3_errmsg(db));
    }

    sqlite3_close(db);

}
Run Code Online (Sandbox Code Playgroud)