2015-09-20 252 views
1

我试图修改one of the FireDAC sample projects以便使用现有的SQLite文件作为数据库源。该示例工作正常,未修改并连接到其数据库。但是,我无法确定它连接到的数据库在哪里指定,以便更改它。如何在FireDAC的TFDPhysSQLiteDriverLink组件中指定SQLite数据库文件?

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

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

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

我还试图creating a temporary connection definition at runtime,通过双击TFDConnection组分List of all Database properties defined in the FireDAC.Phys.SQLite unit

列表。这只是给出了一个例外:

Exception double-clicking the TFDConnection component

异常双击TFDConnection组件

这个问题唯一的解决方案,我发现是XE5文档,在那里说to set the $(PUBLICDOCUMENTSDIR) environment variable英寸我已经必须这样做才能让演示运行(之前,它在FDConnection1.Connected := True;行上抛出了相同的异常;现在不会,演示在运行时完美运行)。这种变化显然不会影响设计人员,并且我甚至不知道我是否在正确的地方寻找,因为在所有文档都谈到设置Database属性之后。

所以我很难过。它在哪里设置数据库?它不在DFM或任何流式属性中;它不在文档定义的属性中(TFDPhysSQLiteDriverLink.Database不存在,也没有任何看起来像它的东西);它不在TFDConnection designtime编辑器中(尽管它引发了一个异常,这里指定为属性的文件会出现在流式DFM中,我想);它不在代码中; ...还有哪些地方呢?

(我从来没有使用FireDAC之前,所以是一个完整的小白,顺便说一句,我是通过文档和示例自学。)

回答

2

你实际上并不需要TFDPhysSQLiteDriverLink一个最低限度FireDAC项目,如果你第一次尝试与数据库建立连接,那么使用它会让问题变得混乱。

试试这个:

  • 记下名字,包括一个SQLite数据库的路径。

  • 启动一个新的VCL项目并在其窗体上放置一个TFDconnection,TFDQuery,TDataSource & TDBGrid并将它们连接起来。设置TDFQuery的Sql来从你知道存在于db中的某个表中选择*。

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

  • 设置DriverIDSQLite并插入你的数据库名字为DatabaseValue框。

  • 打开FDQuery。

如果你编译并运行该项目,你会得到一个异常,告诉你一个类工厂的TFDGUIxWaitCursor丢失(这是诸如此类的事情,我喜欢FireDAC),但是这很容易被丢弃固定一个到你的表格上。请注意,您不必将其使用Object Inspector连接到任何其他FD组件。

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

+0

感谢Martyn。我认为连接编辑器是抛出异常(见上文),但我会再试一次。你的步骤很清楚,并且解释得很好,谢谢! –

+0

我这样做的方式只是在连接编辑器的数据库值框中包含.Sqlite文件的完整路径 - 这就是我所要做的。我使用XE8 btw。 – MartynA

+0

谢谢 - 因为我知道了,所以我删除了我的评论(我误读了你写的内容,看着错误的文本框,而不是下面的参数),但你仍然回答; –

1

我ussualy推出自己的类和处理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后裔

+0

啊,所以没有Database属性,而是一个字符串参数? –

+0

是的,因为一些DBMS不是基于文件的(比如说,SQLite,Firebird),而是在MS SQL Server上思考;你没有在磁盘上指定文件,你实际上在连接字符串中设置了数据库的别名 –

+0

无论哪种方式,它仍然是一个连接字符串,不过,不是它,不管它是文件名还是别的东西?文档确实很清楚地说有一个数据库属性... –

相关问题