C++ 在只读模式下打开数据库时发生SQLITE_CANTOPEN错误
我想以只读方式打开数据库:C++ 在只读模式下打开数据库时发生SQLITE_CANTOPEN错误,c++,c,sqlite,C++,C,Sqlite,我想以只读方式打开数据库: exit = sqlite3_open_v2( "database.db?immutable=1" , &db_ , SQLITE_OPEN_READONLY | SQLITE_OPEN_URI , nullptr ); 但我得到了一个错误:SQLITE_CANTOPEN,知道为什么吗 如果我这样打开它,则open成功: exit = sqlite3_open( "database.db" , &db_ ); 使用SQLITE\u OPEN\u U
exit = sqlite3_open_v2( "database.db?immutable=1" , &db_ , SQLITE_OPEN_READONLY | SQLITE_OPEN_URI , nullptr );
但我得到了一个错误:SQLITE_CANTOPEN,知道为什么吗
如果我这样打开它,则open成功:
exit = sqlite3_open( "database.db" , &db_ );
使用SQLITE\u OPEN\u URI时“文件名可以解释为URI”。但是,要将其视为URI,它必须以
file:
作为前缀,否则它将被视为普通文件名
因此,您试图打开一个名为database.db?immutable=1的文件,该文件显然不存在。请注意,使用SQLITE\u OPEN\u READONLY时,“如果数据库不存在,则返回错误”。因此,最简单的修复方法就是将字符串设置为file:database.db?immutable=1
然而,我建议你只坚持一种提供特殊选择的方法;使用SQLITE\u OPEN\u URI
标志,并将所有其他选项放入URI中,如:file:database.db?mode=ro&immutable=1
(我意识到并非所有选项的组合都可以只使用一种方法,但在您的情况下,它是可行的,因此我建议您坚持使用一种方法,这样您就不必担心不同方法之间的交互方式)
SQLITE\u OPEN\u READONLY
标志与SQLITE\u OPEN\u URI
模式结合使用。我建议尝试使用READONLY
标志,并将普通数据库名称作为第一个参数传递。(我认为在URI模式下,您需要在db名称前面加上文件:
)。或者,只使用URI
标志,然后使用file:database.db?mode=ro&immutable=1
@BoBTFish看起来像SQLITE\u OPEN\u URI
启用URI文件名,但非URI仍然有效:“如果启用了URI文件名解释,并且文件名参数以“file:”开头,则文件名被解释为URI”@AlanBirtlesdatabase.db?immutable=1
不是一个非URI,因此它需要文件:
前缀。@BoBTFish是的,没有发现