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”@AlanBirtles
database.db?immutable=1
不是一个非URI,因此它需要
文件:
前缀。@BoBTFish是的,没有发现