我写了这个示例C代码来打开数据库:
#include <stdio.h>
#include <sqlite3.h>
#include "litereplica.h"
int main(int argc, char* argv[])
{
sqlite3 *db;
char *zErrMsg = 0;
int rc;
char *uri ="file:/path-to-db/fuel_transaction_1.db";
rc = sqlite3_open(uri, &db);
if( rc ){
fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
return(0);
}else{
fprintf(stderr, "Opened database successfully\n");
}
sqlite3_close(db);
}
编译并运行此代码时,输出为Can't open database: unable to open database file
。
我将char *uri ="file:/path-to-db/fuel_transaction_1.db";
更改为:char *uri ="/path-to-db/fuel_transaction_1.db";
并打开了数据库。
有人能告诉我为什么它不能识别URI文件名吗?
谢谢,
答案 0 :(得分:1)
简而言之:如果你想拥有URI支持,你必须使用SQLITE_USE_URI = 1编译你的sqlite,或者使用这一行来打开你的数据库。
rc = sqlite3_open_v2(uri, &db, SQLITE_OPEN_CREATE | SQLITE_OPEN_READWRITE | SQLITE_OPEN_URI, NULL);
向后兼容性
为了保持旧版应用程序的完全向后兼容性,默认情况下禁用URI文件名功能。可以使用SQLITE_USE_URI = 1或SQLITE_USE_URI = 0编译时选项启用或禁用URI文件名。可以使用sqlite3_config(SQLITE_CONFIG_URI,1)或sqlite3_config(SQLITE_CONFIG_URI,0)配置调用在启动时更改URI文件名的编译时设置。无论编译时或开始时设置如何,都可以通过将作为F参数传递的位集中的SQLITE_OPEN_URI位包含在sqlite3_open_v2(N,P,F,V)中来为各个数据库连接启用URI文件名。 p>
如果在最初打开数据库连接时识别URI文件名,则还将在ATTACH语句中识别URI文件名。同样,如果首次打开数据库连接时无法识别URI文件名,则ATTACH将无法识别它们。
由于SQLite始终将任何不以“
file:
”开头的文件名解释为普通文件名,而不管URI设置如何,并且因为实际文件以“file:
开头是非常罕见的“,即使当前没有使用URI文件名,大多数应用程序也可以安全地启用URI处理。
试试这段代码:
#include <stdio.h>
#include <sqlite3.h>
#include "litereplica.h"
int main(int argc, char* argv[])
{
sqlite3 *db;
char *zErrMsg = 0;
int rc;
char *uri ="file:/path-to-db/fuel_transaction_1.db";
rc = sqlite3_open_v2(uri, &db, SQLITE_OPEN_CREATE | SQLITE_OPEN_READWRITE | SQLITE_OPEN_URI, NULL);
//rc = sqlite3_open(uri, &db);
if( rc ){
fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
return(0);
}else{
fprintf(stderr, "Opened database successfully\n");
}
sqlite3_close(db);
}