C 当数据库日志文件存在时,准备语句会导致SQLITE\u IOERR\u锁定

C 当数据库日志文件存在时,准备语句会导致SQLITE\u IOERR\u锁定,c,sqlite,C,Sqlite,我在使用C(Linux RHEL5,64位)中的sqlite3 API从崩溃中恢复时遇到了一个问题,当时我只剩下.db和.db journal文件 如果我用sqlite3二进制文件本身检查.db文件并运行SELECT*fromt,二进制文件将删除.db日志文件并恢复正常 然而,在我的应用程序中,我在一个有效的sqlite*上准备了相同的语句,它返回sqlite\u IOERR | sqlite\u IOERR\u LOCK: #define SQLITE_IOERR_LOCK

我在使用C(Linux RHEL5,64位)中的sqlite3 API从崩溃中恢复时遇到了一个问题,当时我只剩下
.db
.db journal
文件

如果我用
sqlite3
二进制文件本身检查
.db
文件并运行
SELECT*fromt
,二进制文件将删除
.db日志
文件并恢复正常

然而,在我的应用程序中,我在一个有效的
sqlite*
上准备了相同的语句,它返回
sqlite\u IOERR | sqlite\u IOERR\u LOCK

#define SQLITE_IOERR_LOCK              (SQLITE_IOERR | (15<<8))
#define SQLITE_IOERR       10   /* Some kind of disk I/O error occurred */

我在阅读我的问题时找到了答案…显然,要恢复到db文件,程序需要使用读写访问权限打开它。嗯。更改:

    sqlite_result = sqlite3_open_v2(argv[1],
                                    &db_ptr,
                                    SQLITE_OPEN_READONLY,
                                    NULL);
致:


解决了这个问题。在真实的程序中,而不是在测试应用程序中,我打开的语句与prepare语句相距甚远,以至于我甚至没有注意到在特定情况下它是只读的。

我在阅读我的问题时找到了答案……显然,要恢复到db文件,程序需要使用READWRITE访问权限打开它。嗯。更改:

    sqlite_result = sqlite3_open_v2(argv[1],
                                    &db_ptr,
                                    SQLITE_OPEN_READONLY,
                                    NULL);
致:

解决了这个问题。在真实的程序中,而不是在测试应用程序中,我打开的语句与prepare语句相距甚远,以至于我甚至没有注意到它在特定情况下是只读的

    sqlite_result = sqlite3_open_v2(argv[1],
                                    &db_ptr,
                                    SQLITE_OPEN_READONLY,
                                    NULL);
    sqlite_result = sqlite3_open_v2(argv[1],
                                    &db_ptr,
                                    SQLITE_OPEN_READWRITE,
                                    NULL);