上回介紹了 DBX framework 的好處,我們來看看實作的程式碼:
var
LDBXConn: TDBXConnection;
LCmd: TDBXCommand;
LReader: TDBXReader;
begin
LDBXConn := SQLConnection1.DBXConnection;
LCmd := LDBXConn.CreateCommand;
LCmd.Text := 'SELECT * FROM employee';
LReader := LCmd.ExecuteQuery;
...
LCmd.Close;
LCmd.Free;
end;
由上面的原始碼可以看出,DBX framework 是建立在 dbExpress 上,但 FireDAC 的 TFDConnection 沒有內建 DBX framework,難道魚和熊掌不可兼得嗎?
當然可以!
FireDAC 是個海納百川的元件組
(雖然我對它沒有愛),和 dbExpress 結合倒也不是件難事。
使用的元件組是:
- TFDConnection.
- TFDPhysTDBXDriverLink.
FireDAC 的連線精靈很方便,只需注意:
- Driver ID = TDBX (DBX4) or DBX (DBX v1~v3)
- DriverName = 參考 dbExpress 區的 Driver Name (如 MSSQL、IBLite 等)
若有購買 dbExpress 3rd driver,在 FireDAC 包裝下,可以直接使用 TFDQuery,再也不用 TSQLQuery, TDataSetProvider, TClientDataSet 三個元件、三個步驟了。
哎呀,被你發現還有後續內容啦。
FDConnection 包裝 dbExpress 後,利用 TFDCustomConnection.CliObj,DBX 元件組便可以利用它,再透過轉型的方式重現。
CliObj = Call Level Interface Object. (白話文是:切到【手動排檔】模式)
它的包裝單元很豐富,表格如下:
Driver
|
Wrapping class and unit
|
Advantage
|
TFDSConnection, FireDAC.Phys.ADSWrapper.pas
|
dbExpress (v <= 3)
|
ISQLConnection
|
InterBase, Firebird
|
TIBDatabase, FireDAC.Phys.IBWrapper.pas
|
MySQL
|
TMySQLSession, FireDAC.Phys.MySQLWrapper.pas
|
Microsoft SQL Server
|
TODBCConnection, FireDAC.Phys.ODBCWrapper.pas
|
Microsoft Access
|
TODBCConnection, FireDAC.Phys.ODBCWrapper.pas
|
IBM DB2
|
TODBCConnection, FireDAC.Phys.ODBCWrapper.pas
|
Sybase SQL Anywhere
|
TODBCConnection, FireDAC.Phys.ODBCWrapper.pas
|
ODBC
|
TODBCConnection, FireDAC.Phys.ODBCWrapper.pas
|
Oracle
|
TOCIService, FireDAC.Phys.OracleWrapper.pas
|
PostgreSQL
|
TPgConnection, FireDAC.Phys.PgWrapper.pas
|
SQLite
|
TSQLiteDatabase, FireDAC.Phys.SQLiteWrapper.pas
|
TDBX (v >= 4)
|
TDBXConnection, FireDAC.Phys.TDBX.pas
|
DataSnap
|
TDBXConnection, FireDAC.Phys.TDBX.pas
|
MongoDB
|
TMongoConnection, FireDAC.Phys.MongoDBWrapper.pas
|
之後只要改一行文字即可,如以下紅字內容:
var
LDBXConn: TDBXConnection;
LCmd: TDBXCommand;
LReader: TDBXReader;
begin
LDBXConn := TObject(FDConnection1.CliObj) as TDBXConnection;
LCmd := LDBXConn.CreateCommand;
LCmd.Text := 'SELECT * FROM employee';
LReader := LCmd.ExecuteQuery;
...
LCmd.Close;
LCmd.Free;
end;
警告:效能控請小心服用!
結語:
DBX framework 打從問市以來一直在傳達「以貼近底層的方式發揮程式最大效能」的概念。
但現實的程式設計市場是以【包裝便利】取勝。
從多數 Delpher 對 BDE、ADO 至死不渝,可以看出 Delphi 市場的真實偏好。
官方 FireDAC 的出現,可以看出 Delphi 對市場的妥協。
好的產品不一定賣,會賣的一定是對消費者有價值的產品。
對我們來說,能夠簡化工作量的才是有價值的工具。
在 DBX framework 是加重工作量,而 FireDAC 能簡化開發工作量,對多數的 Delphier 來說,這才是有價值的。
同樣是開發產品的我們,DBX framework 歷史教訓值得學習 ── 要做有價值的產品。
然而,DBX framework 所帶來架構設計上的轉變是不容忽視的,秘密就在……
文內表格裡的彩蛋,您發現了嗎?
See also: