如果尝试打开不存在的文件,sqlite3_open不会返回错误

时间:2017-09-06 10:33:32

标签: c database sqlite

int main(int argc,char **argv){ 
 int rc
 sqlite3 *db;

 rc = sqlite3_open(argv[1], &db);

 printf("rc = %d\n", rc);
 if(rc){
    printf("Not Valid Database\n");
    sqlite3_close(db);
    exit(1);
}

如果我使用./test exsisting_database.sqlite3运行它,则会按预期返回0。但是对于./test not_exsisting_database.sqlite3,它仍会返回0并创建文件not_exsisting_database.sqlite3

1 个答案:

答案 0 :(得分:2)

从打开数据库的SQLite文档中找到: https://sqlite.org/c3ref/open.html

  

sqlite3_open_v2()界面的工作方式类似于 sqlite3_open(),但   它接受两个额外的参数来进行额外的控制   新的数据库连接。 sqlite3_open_v2()的flags参数可以   取以下三个值之一,可选择与   SQLITE_OPEN_NOMUTEX,SQLITE_OPEN_FULLMUTEX,SQLITE_OPEN_SHAREDCACHE,   SQLITE_OPEN_PRIVATECACHE和/或SQLITE_OPEN_URI标志:

     

SQLITE_OPEN_READONLY数据库以只读模式打开。如果   数据库尚不存在,返回错误。

     

SQLITE_OPEN_READWRITE打开数据库进行读写   如果可能,或仅在文件被写保护时才读取   操作系统。在任何一种情况下,数据库必须已存在,   否则会返回错误。

     

SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE打开数据库   读写,如果尚不存在则创建。   这是始终用于sqlite3_open()和sqlite3_open16()的行为。

所以你需要使用没有SQLITE_OPEN_CREATE标志的sqlite3_open_v2()而不是sqlite3_open()