如果使用SQLITE_OPEN_READONLY打开数据库,则sqlite3_prepare会失败

时间:2015-01-06 08:37:54

标签: sqlite

如果使用SQLITE_OPEN_READONLY打开数据库,

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 );
} 

1 个答案:

答案 0 :(得分:1)

问题出在OS锁定实现中。如果以只读权限打开文件,Fcntl()不允许锁定文件。因此,SQLite无法在只读模式下执行任何操作。