Database 如何在FireDAC的TFDPHYSqliteDriverLink组件中指定SQLite数据库文件?

Database 如何在FireDAC的TFDPHYSqliteDriverLink组件中指定SQLite数据库文件?,database,sqlite,delphi,firedac,delphi-10-seattle,Database,Sqlite,Delphi,Firedac,Delphi 10 Seattle,我正在尝试修改,以便使用现有的SQLite文件作为数据库源。该示例未经修改即可正常工作,并连接到其数据库。但是,我无法确定它连接到的数据库是在哪里指定的,以便对其进行更改 ,TFDPHYSqliteDriverLink组件上应该有一个数据库属性。没有:它不存在。我甚至将表单转换为文本,并查看了所有组件的自定义属性,但在任何地方都没有定义路径。代码中也没有-示例非常小,并且根本没有定义路径 文档中的另一个选项是包含FireDAC.Phys.SQLite单元,尽管这并没有解释如何设置数据库,因为据我

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

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

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

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

我还通过双击TFDConnection组件进行了尝试。这只是一个例外:

双击TFDConnection组件时出现异常

我找到的唯一解决方案是XE5文档,其中写道。我之前已经必须这样做才能让演示运行,它在FDConnection1行抛出了相同的异常;;现在不行,演示在运行时运行得很好。这一变化显然没有影响到设计师,我甚至不知道我是否找对了地方,因为所有文档都在讨论设置数据库属性

所以我被难住了。它在哪里设置数据库?它不在DFM或任何流属性中;它不在文档TFDPhysSQLiteDriverLink定义的属性中。数据库不存在,也不存在任何类似的内容;它不在TFDConnection designtime编辑器中,即使它引发异常,我认为这里指定为属性的文件将出现在流式DFM中;它不是在代码中。。。它还能在哪里


我以前从未使用过FireDAC,所以我是一个完全的noob,顺便说一句。我正在通过文档和示例进行自学。

对于一个极简的FireDAC项目,实际上不需要TFDPHYSqliteDriverLink,如果您第一次尝试连接到数据库,使用TFDPHYSqliteDriverLink会让问题变得相当混乱

试试这个:

记下Sqlite数据库的名称(包括路径)

启动一个新的VCL项目,将TFDconnection、TFDQuery、TDataSource和TDBGrid放到表单上并将它们连接起来。将TDFQuery的Sql设置为从数据库中已知的某个表中选择*

右键单击TFD连接,然后从弹出窗口中选择连接编辑器

将DriverID设置为SQLite,并将您的db名称插入数据库值框

打开FDQuery

如果编译并运行该项目,将出现异常,告诉您TFDGUIxWaitCursor的类工厂丢失了这是我喜欢的FireDAC的一种类型,但将它放到表单上很容易解决。请注意,您不必使用对象检查器将其连接到任何其他FD组件


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

我通常会滚动自己的类并处理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子体,所以没有数据库属性,只有一个字符串参数?是的,因为有些DBMS不是基于文件的,比如说SQLite、Firebird,而是基于MS SQL Server;你没有在磁盘上指定一个文件,你实际上在连接字符串中设置了DB的别名。不管怎样,它仍然是一个连接字符串,不是吗,不管是文件名还是其他什么?文档确实非常清楚地说明了数据库属性……文档是正确的,但不是非常准确:您链接的是TFDConnection的参数。具体来说,图表中的是SQLite支持的那些也许你需要的是感谢Martyn。我认为是连接编辑器引发了上述异常,但我会再试一次。你的步骤很清楚,解释得很好,谢谢!我这样做的方式只是在连接编辑器的数据库值框中包含.Sqlite文件的完整路径,这就是我所要做的。我正在使用XE8顺便说一句。谢谢-我删除了我的评论,因为我发现我误读了你写的内容,而且是loo king在错误的文本框中,不是下面的参数,而是您回复的;