【问题标题】:How do you specify the SQLite database file in FireDAC's TFDPhysSQLiteDriverLink component?如何在 FireDAC 的 TFDPhysSQLiteDriverLink 组件中指定 SQLite 数据库文件?
【发布时间】:2015-09-20 17:26:09
【问题描述】:

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

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

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

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

我还尝试了creating a temporary connection definition at runtime,方法是双击TFDConnection 组件。这只给出了一个例外:

双击 TFDConnection 组件出现异常

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

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

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

【问题讨论】:

    标签: database sqlite delphi firedac delphi-10-seattle


    【解决方案1】:

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

    试试这个:

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

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

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

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

    • 打开 FDQuery。

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

    之后,您可以添加TFDPhysSQLiteDriverLink 并将其DriverID 设置为与TFDConnection 相同。

    【讨论】:

    • 谢谢马丁。我认为连接编辑器是引发异常的原因(见上文),但我会再试一次。你的步骤很清楚,解释得很好,谢谢!
    • 我所做的只是在连接编辑器的数据库值框中包含 .Sqlite 文件的完整路径——这就是我所要做的。顺便说一句,我正在使用 XE8。
    • 谢谢 - 我弄明白后删除了我的评论(我看错了你写的内容,看错了文本框,而不是下面的参数)但你还是回复了;)
    【解决方案2】:

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

    【讨论】:

    • 啊,所以没有Database属性,而是字符串参数?
    • 是的,因为有些 DBMS 不是基于文件的(比如 SQLite、Firebird),而是在 MS SQL Server 上思考;您没有在磁盘上指定文件,实际上是在连接字符串中设置了数据库的别名
    • 不管怎样,它仍然是一个连接字符串,不是吗,无论是文件名还是其他什么?并且文档确实很清楚地说有一个数据库属性......
    • 文档是“正确的”,但不是很准确:) 您链接的那些是 TFDConnection 的参数。而且,具体来说,图表中的那些是 SQLite 支持的。-检查this
    • 也许你需要的是this
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-10
    • 2019-02-05
    • 2011-09-23
    • 2022-06-10
    • 1970-01-01
    • 2022-10-09
    相关资源
    最近更新 更多