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 用同一個連接對象就可以了。

但是,如果是個多線程程序,有兩個線程在同時加載兩個不同的表的內容,或者一個線程在讀一個表,另外一個線程在寫另外一個表,就可以需要兩個數據庫連接對象實例了。對同一個連接對象實例,兩個線程同時去操作,可能會導致一些問題,本質上是兩個線程在同時操作一個相同的內存空間,可能會帶來衝突。

還有沒有其它需要多個數據庫連接實例的理由?請留言告訴我。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章