你知道为什么当我打电话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
- 使用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);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
22905 次 |
| 最近记录: |