#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);
Обратная совместимость
Чтобы поддерживать полную обратную совместимость для устаревших приложений, функция имени файла 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
достаточно ясно, не так ли?`