当我在一个空数据库上调用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()
。我认为这可能是因为线程并发,但使用临界区也没有帮助。
答案 0 :(得分:12)
这是documentation所说的错误原因:
- 使用不是的sqlite3 *指针调用任何API例程 从sqlite3_open()或sqlite3_open16()获得或者有 已被sqlite3_close()关闭。
- 尝试在同一时刻使用相同的数据库连接 来自两个或更多线程的时间。
- 使用sqlite3_stmt *语句指针调用sqlite3_step() 不是从sqlite3_prepare()或sqlite3_prepare16()或。获得的 已被sqlite3_finalize()销毁。
- 在该语句运行时尝试将值绑定到语句(使用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);
}
答案 1 :(得分:1)
以上所有解决方案都是正确的。
但是,您可能写错了列名或者是 错误在您的查询中输入了错误的列名称 执行。
因为在我的情况下,我多次得到错误后,我逐行检查代码,我发现了我的错误
答案 2 :(得分:1)
在我的情况下,它是一个包含一些特殊字符的字符串,就像它是(&#39;)单个冒号我用(&#34;&#34;)替换它一个空格并开始工作。 [yourString stringByReplacingOccurrencesOfString:@&#34;&#39;&#34; withString:@&#34;&#34;]