如果使用 SQLITE_OPEN_READONLY 打开数据库,sqlite3_prepare 将失败
sqlite3_prepare fails if db opened with SQLITE_OPEN_READONLY
如果使用 SQLITE_OPEN_READONLY. 打开 DB,sqlite3_prepare 函数将失败
Error message: error #10: disk I/O error
Sqlite extended error code: SQLITE_IOERR_LOCK (3850)
Errno: EBADF 9 /* Bad file number */
如果使用 SQLITE_OPEN_READWRITE 打开数据库,一切正常 | SQLITE_OPEN_CREATE |
SQLITE_OPEN_FULLMUTEX;
关于什么可能导致此问题的任何想法?
rc=sqlite3_open_v2("example.db",&db,SQLITE_OPEN_READONLY,0);
sqlite3_busy_timeout(db,1000);
selectQuery = "select * from test;";
rc = sqlite3_prepare(db, selectQuery, strlen(selectQuery), &stmt, 0);
if(rc!=SQLITE_OK)
{
printf("sql error #%d: %s", rc, sqlite3_errmsg(db));
printf( "SQL ext error: %d\n", sqlite3_extended_errcode(db));
printf( "errno: %d\n", errno );
}
问题出在 OS 锁定实现中。 Fcntl() 不允许锁定以只读权限打开的文件。结果 - SQLite 在只读模式下无法执行任何操作。
sqlite3_prepare 函数将失败
Error message: error #10: disk I/O error
Sqlite extended error code: SQLITE_IOERR_LOCK (3850)
Errno: EBADF 9 /* Bad file number */
如果使用 SQLITE_OPEN_READWRITE 打开数据库,一切正常 | SQLITE_OPEN_CREATE |
SQLITE_OPEN_FULLMUTEX;
关于什么可能导致此问题的任何想法?
rc=sqlite3_open_v2("example.db",&db,SQLITE_OPEN_READONLY,0);
sqlite3_busy_timeout(db,1000);
selectQuery = "select * from test;";
rc = sqlite3_prepare(db, selectQuery, strlen(selectQuery), &stmt, 0);
if(rc!=SQLITE_OK)
{
printf("sql error #%d: %s", rc, sqlite3_errmsg(db));
printf( "SQL ext error: %d\n", sqlite3_extended_errcode(db));
printf( "errno: %d\n", errno );
}
问题出在 OS 锁定实现中。 Fcntl() 不允许锁定以只读权限打开的文件。结果 - SQLite 在只读模式下无法执行任何操作。