sqlite3_open无法识别C

时间:2016-10-19 13:13:01

标签: c sqlite uri

我写了这个示例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文件名吗?

谢谢,

1 个答案:

答案 0 :(得分:1)

简而言之:如果你想拥有URI支持,你必须使用SQLITE_USE_URI = 1编译你的sqlite,或者使用这一行来打开你的数据库。

rc = sqlite3_open_v2(uri, &db, SQLITE_OPEN_CREATE | SQLITE_OPEN_READWRITE | SQLITE_OPEN_URI, NULL);

来自SQLite documentation

  

向后兼容性

     

为了保持旧版应用程序的完全向后兼容性,默认情况下禁用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);
}