Как указать файл базы данных SQLite в компоненте FireDAC TFDPhysSQLiteDriverLink?

Я пытаюсь изменить один из примеров проектов FireDAC, чтобы использовать существующий файл SQLite в качестве источника базы данных. Образец отлично работает без изменений и подключается к своей базе данных. Однако я не могу понять, где указана база данных, к которой он подключается, чтобы изменить ее.

Согласно документации, должно быть свойство Database на компоненте TFDPhysSQLiteDriverLink. Его нет: его не существует. Я даже преобразовал форму в текст и просмотрел настраиваемые свойства всех компонентов, и нигде не определен путь. Его нет и в коде — выборка очень мала, и путь вообще не определен.

Другим вариантом в документации является включение модуля FireDAC.Phys.SQLite, хотя это не объясняет, как установить базу данных, поскольку, насколько я могу судить, этот модуль включает только компонент. И когда я ищу свойства базы данных (см. прикрепленное изображение), ни один из них ни в одном классе этого модуля не кажется мне тем, что мне нужно. Ближайшая строка для компонента резервного копирования - сомневаюсь, что это то, что мне нужно. В классе TFDPhysSQLiteConnection есть свойство SQLiteDatabase, но оно доступно только для чтения.

Список всех свойств базы данных, определенных в модуле FireDAC.Phys.SQLite

Список всех свойств базы данных, определенных в модуле FireDAC.Phys.SQLite

Я также попытался создать определение временного соединения во время выполнения, двойным щелчком по компоненту TFDConnection. Это дает только исключение:

Исключение при двойном щелчке компонента TFDConnection

Исключение при двойном щелчке компонента TFDConnection

Единственное решение этой проблемы, которое я нашел, находится в документации по XE5, где сказано: noreferrer">для установки переменной окружения $(PUBLICDOCUMENTSDIR). Я уже должен был сделать это, чтобы запустить демо (ранее оно выдавало такое же исключение в строке FDConnection1.Connected := True;; теперь этого не происходит, демо отлично работает во время выполнения). Очевидно, что это изменение не повлияло на дизайнера, и Я даже не знаю, правильно ли я ищу, так как в документации говорится о настройке свойства Database.

Так что я в тупике. Где он устанавливает базу данных? Его нет в DFM или каких-либо свойствах потоковой передачи; его нет в свойстве, определенном в документации (TFDPhysSQLiteDriverLink.Database не существует и не имеет ничего похожего); его нет в редакторе времени разработки TFDConnection (даже несмотря на то, что он выдает исключение, я думаю, что файл, указанный здесь как свойство, появится в потоковом DFM); это не в коде; ...где еще это может быть?

(Я никогда раньше не использовал FireDAC, так что я полный нуб, кстати. Я самообучаюсь с помощью документации и примеров.)


person David    schedule 20.09.2015    source источник


Ответы (2)


На самом деле вам не нужен TFDPhysSQLiteDriverLink для минималистского проекта FireDAC, и его использование довольно запутывает проблему, если вы пытаетесь установить соединение с базой данных в первый раз.

Попробуй это:

  • Запишите имя, включая путь к базе данных Sqlite.

  • Запустите новый проект VCL и перетащите TFDconnection, TFDQuery, TDataSource и TDBGrid на его форму и соедините их. Установите Sql TDFQuery для выбора * из какой-либо таблицы, которая, как вы знаете, существует в базе данных.

  • Щелкните правой кнопкой мыши TFDConnection и выберите Connection editor во всплывающем окне.

  • Установите DriverID на SQLite и вставьте имя вашей базы данных в поле Database Value.

  • Откройте FDQuery.

Если вы скомпилируете и запустите проект, вы получите исключение, говорящее вам, что фабрика классов для TFDGUIxWaitCursor отсутствует (это то, что мне нравится в FireDAC), но это легко исправить, перетащив один из них на вашу форму. Обратите внимание, что вам не нужно подключать его с помощью Object Inspector к какому-либо другому компоненту FD.

После этого вы можете добавить TFDPhysSQLiteDriverLink и установить для него DriverID то же, что и для TFDConnection.

person MartynA    schedule 20.09.2015
comment
Спасибо, Мартин. Я думаю, что Редактор подключений вызвал исключение (см. Выше), но я попробую еще раз. Ваши шаги ясны и хорошо объясняют, спасибо! - person David; 21.09.2015
comment
То, как я это сделал, заключалось в том, чтобы просто включить полный путь к файлу .Sqlite в поле «Значение базы данных» в редакторе подключений — это все, что мне нужно было сделать. Я использую XE8, кстати. - person MartynA; 22.09.2015
comment
Спасибо - я удалил свой комментарий, так как понял (я неправильно понял, что вы написали, и смотрел не на то текстовое поле, а не на параметры ниже), но вы все равно ответили;) - person David; 22.09.2015

Я обычно запускаю свой собственный класс и обрабатываю событие OnBeforeConnect

Что-то вроде этого

procedure TSQLiteConnection.SQLiteConnectionBeforeConnect(Sender: TObject);
begin
  if not(TFile.Exists(DatabaseFilePath)) then
    Params.Values['OpenMode'] := 'CreateUTF16'
  else
    Params.Values['OpenMode'] := 'ReadWrite';

  Params.Values['Database'] := DatabaseFilePath;
  DriverName := 'SQLite';
end;

DatabaseFilePath — это просто строковое поле класса, поэтому в основном вы можете поместить туда любой путь к файлу.

TSQLiteConnection, конечно же, является потомком TFDConnection.

person Agustin Ortu    schedule 20.09.2015
comment
Ах, значит, здесь нет свойства базы данных, а есть строковый параметр? - person David; 21.09.2015
comment
Да, потому что некоторые СУБД не основаны на файлах (например, SQLite, Firebird), а думают о MS SQL Server; вы не указываете файл на диске, вы фактически устанавливаете псевдоним БД в строке подключения - person Agustin Ortu; 22.09.2015
comment
В любом случае это все еще строка подключения, не так ли, будь то имя файла или что-то еще? И в документации очень четко сказано, что есть свойство базы данных... - person David; 22.09.2015
comment
Документация правильная, но не очень точная :) Те, что вы линкуете, это параметры TFDConnection. И, в частности, на диаграмме указаны те, которые поддерживаются SQLite. - Проверьте это - person Agustin Ortu; 22.09.2015
comment
Возможно, вам нужно что-то вроде это - person Agustin Ortu; 22.09.2015