sqlite3_open не распознает имя файла URI в C

#c #sqlite #uri

#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, amp;db);

   if( rc ){
      fprintf(stderr, "Can't open database: %sn", sqlite3_errmsg(db));
      return(0);
   }else{
      fprintf(stderr, "Opened database successfullyn");
   }   
   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. Попробуйте "file://path-to-db/fuel_transaction_1.db"; (дважды / после file: . Но sqlite3_open принимает ли URI вместо обычного имени файла? В документе этого не сказано.

2. Спасибо за ваш комментарий. но это тоже не сработало.

Ответ №1:

Короче говоря: если вы хотите иметь поддержку URI, вы должны скомпилировать свой sqlite с SQLITE_USE_URI= 1 или использовать эту строку для открытия вашей базы данных.

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

Из документации SQLite:

Обратная совместимость

Чтобы поддерживать полную обратную совместимость для устаревших приложений, функция имени файла URI по умолчанию отключена. Имена файлов URI могут быть включены или отключены с помощью параметров времени компиляции SQLITE_USE_URI=1 или SQLITE_USE_URI=0. Настройка времени компиляции для имен файлов URI может быть изменена во время запуска с помощью конфигурационных вызовов sqlite3_config(SQLITE_CONFIG_URI,1) или sqlite3_config(SQLITE_CONFIG_URI,0). Независимо от настроек времени компиляции или запуска, имена файлов URI могут быть включены для отдельных подключений к базе данных путем включения бита SQLITE_OPEN_URI в набор битов, передаваемых в качестве параметра F в sqlite3_open_v2(N, P,F, V).

Если имена файлов URI распознаются при первоначальном открытии соединения с базой данных, то имена файлов URI также будут распознаны в инструкциях ATTACH. Аналогично, если имена файлов 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, amp;db, SQLITE_OPEN_CREATE | SQLITE_OPEN_READWRITE | SQLITE_OPEN_URI, NULL);

   //rc = sqlite3_open(uri, amp;db);

   if( rc ){
      fprintf(stderr, "Can't open database: %sn", sqlite3_errmsg(db));
      return(0);
   }else{
      fprintf(stderr, "Opened database successfullyn");
   }   
   sqlite3_close(db);
}
  

Комментарии:

1. Спасибо за ваш ответ. на самом деле я не знаю, куда и как я должен добавить SQLITE_USE_URI=1 .

2. Вы используете SQLITE_USE_URI=1, если вы компилируете SQLITE самостоятельно, в противном случае вы можете изменить этот параметр во время выполнения с помощью этой команды: sqlite3_config(SQLITE_CONFIG_URI,1)

3. @Marco, я также пытался добавить sqlite3_config(SQLITE_CONFIG_URI,1) ; , но все равно результат Can't open database: unable to open database file

4. @MichaelWalz: спасибо за комментарий. Я не знаю, где я должен записать uri в sqlite3_open_v2(dbname, amp;db, SQLITE_USE_URI=1, NULL);

5. @mOna documentation достаточно ясно, не так ли?`