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

时间:2011-12-04 02:49:55

标签: sqlite

当我在一个空数据库上调用sqlite3_prepare_v2(CREATE TABLE)时,你知道为什么我会把“Library Routine Call of Sequence of Sequence”?

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

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

3 个答案:

答案 0 :(得分:12)

这是documentation所说的错误原因:

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

你提到尝试一个关键部分,所以我想我们可以排除#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);

}

答案 1 :(得分:1)

以上所有解决方案都是正确的。

  

但是,您可能写错了列名或者是   错误在您的查询中输入了错误的列名称   执行。

因为在我的情况下,我多次得到错误后,我逐行检查代码,我发现了我的错误

答案 2 :(得分:1)

在我的情况下,它是一个包含一些特殊字符的字符串,就像它是(&#39;)单个冒号我用(&#34;&#34;)替换它一个空格并开始工作。 [yourString stringByReplacingOccurrencesOfString:@&#34;&#39;&#34; withString:@&#34;&#34;]