你知道为什么我打电话时会收到“Library Routine Called Out Of Sequence”吗?sqlite3_prepare_v2(CREATE TABLE)
在空数据库上?
我创建一个空数据库,然后打开它。后来我将所有必须写入数据库的信息保存在 RAM 中(我需要将该信息保存在 RAM 中并在执行结束时将其刷新到永久存储),但是当我调用时收到此错误消息sqlite3_prepare_v2(CREATE TABLE)
。它返回“Library Routine Called Out Of Sequence”作为错误消息。
我确实正确打开了我的数据库并且(我认为这可能是一个问题,所以我做了close()
我的数据库然后open()
就在打电话之前sqlite3_prepare_v2(CREATE TABLE)
)。我认为这可能是因为线程并发,但使用临界区也没有帮助。
这就是文档 http://sqlite.org/cvstrac/wiki?p=LibraryRoutineCalledOutOfSequence说明了您的错误原因:
- 使用不是的 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() 并确保在调用准备之前没有任何内容关闭它?
这对我有用:
#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);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)