1

我正在尝试修改FireDAC 示例项目之一,以便使用现有的 SQLite 文件作为数据库源。该示例未经修改即可正常工作并连接到其数据库。但是,我无法弄清楚它连接到的数据库是在哪里指定的,以便对其进行更改。

根据文档,组件上应该有一个Database属性TFDPhysSQLiteDriverLink。不存在:它不存在。我什至将表单转换为文本并查看了所有组件的自定义属性,并且在任何地方都没有定义路径。代码中也没有 - 示例非常小,根本没有定义路径。

文档上的另一个选项是包含该FireDAC.Phys.SQLite单元,尽管这没有解释如何设置数据库,因为据我所知,该单元仅包含该组件。当我搜索数据库属性(见附图)时,该单元的任何类中的任何一个似乎都不是我所追求的。最接近的是用于备份组件的字符串 - 我怀疑这就是我需要的。类中有一个SQLiteDatabase属性,TFDPhysSQLiteConnection但它是只读的。

FireDAC.Phys.SQLite 单元中定义的所有数据库属性的列表

FireDAC.Phys.SQLite 单元中定义的所有数据库属性的列表

我还尝试通过双击组件在运行时创建临时连接定义。TFDConnection这只给出了一个例外:

双击 TFDConnection 组件时出现异常

双击 TFDConnection 组件时出现异常

我发现的唯一解决方案是在 XE5 文档中,它说设置$(PUBLICDOCUMENTSDIR)环境变量。我已经必须这样做才能让演示运行(以前,它在线上抛出了相同的异常FDConnection1.Connected := True;;现在没有,演示在运行时完美运行。)这种变化显然没有影响设计师,我甚至不知道我是否在寻找正确的地方,因为毕竟文档都谈到了设置Database属性。

所以我很难过。它在哪里设置数据库?它不在 DFM 或任何流媒体属性中;它不在文档定义的属性中(TFDPhysSQLiteDriverLink.Database不存在,看起来也不存在);它不在设计时TFDConnection编辑器中(即使它引发异常,我认为此处指定为属性的文件也会出现在流式 DFM 中);它不在代码中;……还能在哪里?

(我以前从未使用过 FireDAC,所以我是一个完整的菜鸟,顺便说一句。我通过文档和示例进行自学。)

4

2 回答 2

2

对于极简的 FireDAC 项目,您实际上并不需要 TFDPhysSQLiteDriverLink,如果您是第一次尝试连接到数据库,那么使用一个会混淆问题。

尝试这个:

  • 记下名称,包括 Sqlite 数据库的路径。

  • 启动一个新的 VCL 项目并将 TFDconnection、TFDQuery、TDataSource 和 TDBGrid 拖放到其窗体上并将它们连接起来。将 TDFQuery 的 Sql 设置为从您知道数据库中存在的某个表中选择 *。

  • 右键单击 TFDConnection 并Connection editor从弹出窗口中选择。

  • 设置DriverIDSQLite并将您的数据库名称插入Database Value框中。

  • 打开 FDQuery。

如果您编译并运行该项目,您将收到一个异常,告诉您缺少 TFDGUIxWaitCursor 的类工厂(这是我喜欢 FireDAC 的那种东西),但这很容易通过将一个放到您的表单上来解决。请注意,您不必使用 将它连接Object Inspector到任何其他 FD 组件。

之后,您可以添加 aTFDPhysSQLiteDriverLink并将其设置DriverID为与TFDConnection.

于 2015-09-20T18:33:42.770 回答
1

我通常开设自己的班级并处理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 的后代

于 2015-09-20T19:32:02.300 回答