FireDAC 学习 - 3:建立数据库连接 之 TFDManager

使用数据库,第一步是建立和数据库的连接。结果关于连接,不是第一篇,而是本系列第三篇。

我使用 FireBird 开源数据库作为测试。FireDAC 支持 FireBird。

在本系列第一篇,我没有仔细说 FDConnection1 是如何与数据库建立连接的。我用了最简单的办法,也就是双击设计期拖到界面上的 FDConnection1,它会弹出一个对话框。在那个对话框里面进行设置就好了,如下图:

如上图,我指定 FireBird 数据库文件 TESTDATA.fdb 的全路径名称给 DataBase 属性,指定用户名和密码,以及访问方式是 TCPIP 和数据库服务器地址 127.0.0.1(也就是本机)。其它参数我采用的是默认值,没有指定。

然后点这个对话框上面那个 Test 按钮,连接成功,说明我对这个 FDConnection1 的设置成功了。

另外提醒一下,FDConnection1 有个属性:LoginPrompt 默认是 True,我在设计期的属性面板里面找到这个属性,改为 False,避免每次连接数据库都弹对话框要求我输入数据库的用户名和密码。因为我已经在上述连接参数里面输入过了。

到这里,连接设置就完成了。拖一个 FDQuery1 过来,它的 Connection 属性会自动添加已经存在的 FDConnection1,因此无需再特意去做设置。只需要对它的 SQL 属性在属性面板里面双击弹出的对话框里面写 SQL 语句就可以了,我这里写:

select * from TAB_AUTO

然后在属性面板里面的第一条是 FDQuery1 的 Active 属性,双击将 False 变成 True,成功。说明 FDQuery1 通过 FDConnection1 连接数据库成功了。

----------------------------------------------  分割线 --------------------------------------

如果程序中有多个 FDConnection 需要连接同一个数据库,对每个 FDConnection 进行参数设置,不管是设计期还是运行期做,都是很麻烦的。

如果参数需要在安装程序时进行修改,比如不同的场合数据库文件的路径不同,数据库服务器的 IP 地址不同等等,把这些参数写死在程序里面是不行的。对应这种情况,我通常是把连接参数写成外部文件,程序运行时从外部文件加载连接参数。会写一些代码,比如:

1. 读入外部文件;

2. FDConnection1 的某些参数等于外部文件的某行参数值(这里可能有很多行代码);

3. FDConnection2 的某些参数等于外部文件的某行参数值(这里可能有很多行代码);

诸如此类的代码有好多行。

针对上述问题,FireDAC 提供了一个 TFDManager 控件。设计期拖一个出来放到界面上,指定其属性 ConnectionDefFileName 为外部参数文件,看下图:

上图我只改了一个属性,就是那行 D:\Test\FireDAC\FireBirdTest.ini

这个 FireBirdTest.ini 文件就是数据库连接参数,其内容如下:

[FireBirdTest2]
Database=D:\test\AutoInc\data\TESTDATA.fdb
Server=127.0.0.1
User_Name=SYSDBA
Password=masterkey
Protocol=TCPIP
DriverID=FB

上述 ini 的内容和前面直接在设计期的对话框里设置的数据库参数一样。这里要注意的是 Ini 的小结名:[FireBirdTest2]

在设计期,当给 FDManager1 指定了这个 ini 文件以后,选中 FDConnection1,在属性面板里面找到它的  ConnectionDefName,鼠标点击空白的地方出来的下拉按钮,会显示 FireBirdTest2,选择它。这是告诉 FDConnection1采用 FireBirdTest2 的连接参数。

做完这一步,这个 FDConnection1 的其它连接参数无需设置,它自动使用 FDManager1 指向的那个 ini 里面的参数。

然后,如果还有其它的 FDConnection2, FDConnection3 需要连接同一个数据库,同样只需要指定 ConnectionDefName 为 FireBirdTest2 这个字符串就可以了。再次说明,FireBirdTest2 这个字符串就是 ini 文件里面的小节名

总结:

到这里,我发现,这个 FDManager1 就是帮我把以前我要写的加载外部配置参数文件的代码帮我写了。我只要有个 ini 文件保存数据库参数,然后指定 FDConnection1 的 ConnectionDefName 属性的字符串就可以了。

------------------- 分割线 -----------------------

为啥一个程序里需要很多 Connection 呢?这是个很好的问题。

我看过一些很大的项目的源代码,同一个项目参与的程序员很多,每个程序员不管项目里面已经有数据库连接对象了,在自己需要数据库连接的时候,就拖一个连接对象过来。这种偷懒导致了一个程序同时有很多个数据库连接,消耗数据库连接资源。正常情况下,所以的 Query 用同一个连接对象就可以了。

但是,如果是个多线程程序,有两个线程在同时加载两个不同的表的内容,或者一个线程在读一个表,另外一个线程在写另外一个表,就可以需要两个数据库连接对象实例了。对同一个连接对象实例,两个线程同时去操作,可能会导致一些问题,本质上是两个线程在同时操作一个相同的内存空间,可能会带来冲突。

还有没有其它需要多个数据库连接实例的理由?请留言告诉我。

猜你喜欢

转载自blog.csdn.net/pcplayer/article/details/106951747
今日推荐