DELPHI XE 10.1 BERLIN 使用FIREDAC連線資料庫(SQL SERVER, MYSQL, SQLITE)
此程式是寫的一個Demo, 包含一個主窗體, 一個數據模組.
1. 主窗體設計如下:
提供一個初始化, 一個查詢, 一個釋放.
初始化用於資料模組例項化, 查詢就是執行SQL語句, 釋放就是釋放資料模組例項. 其它沒啥說的.
窗體上方是一個RadioGroup, 丟了四個按鈕, 也就是四個資料庫型別, 每個按鈕控制元件的TAG分別設定了0123, 用於資料庫連線切換方式的切換..
窗體左下方是四個SQL語句, 分別對應了四個資料庫.
2. 資料模組設計如下:
首先, 在程式根目錄下新建一個記事本, 重新命名為Driver.ini, 內容如下:
[MSSQL_Pool] DriverID=MSSQL Pooled=True Server=192.168.2.188 Database=yqsh_SmartTable User_Name=sa Password=123 POOL_CleanupTimeout=0 POOL_ExpireTimeout=0 POOL_MaximumItems=50 CharacterSet=UTF8 [MySQL_Pool] DriverID=MySQL Pooled=True Database=ungsm User_Name=root Password=1234 POOL_CleanupTimeout=0 POOL_ExpireTimeout=0 POOL_MaximumItems=50 Server=192.168.2.188 UseSSL=True CharacterSet=utf8 [SQLite_Pool] Pooled=True Database=smarttable.db POOL_MaximumItems=10 DriverID=SQLite
可以看出, 有三種連線方式, 分別是MSSQL_Pool, MySQL_Pool,SQLite_Pool, 分別對應三種資料庫連線, 這個名字是自定義的.
如果不知道這些引數怎麼來, 可以在資料模組丟一個TFDConnection控制元件(最後刪除掉), 雙擊控制元件, 如下圖所示:
然後配置引數, 然後再點選[Info], 如下入所示:
上圖選中部分其實就是Driver.ini中的配置引數, 拷貝出來, 自定義一個節點(比如: MSSQL_Pool)就好了.
然後再說下資料模組中的控制元件:
TFDManager 設定屬性ConnectionDefFileName, 這個設定Driver.ini的路徑就可以了, 因為Driver.ini就在根目錄下, 就直接寫Driver.ini就可以了, 設定FetchOptions.Mode為fmAll.
TFDConnection 設定FetchOptions.Mode為fmAll. ConnectionDefName動態指定.
TFDQuery 設定connection屬性, 下拉選擇TFDConnection即可.
TFDGUIxWaitCursor 丟一個
TFDPhysMSSQLDriverLink 丟一個 連線驅動
TFDPhysMySQLDriverLink 丟一個 連線驅動
TFDPhysSQLiteDriverLink 丟一個 連線驅動
TFDPhysOracleDriverLink 丟一個 連線驅動
3. 主窗程式碼如下:
unit uFrmMain; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ComCtrls, Vcl.ExtCtrls; type TForm1 = class(TForm) mm1: TMemo; Button4: TButton; Button5: TButton; Button6: TButton; RadioGroup1: TRadioGroup; RadioButton1: TRadioButton; RadioButton2: TRadioButton; RadioButton3: TRadioButton; RadioButton4: TRadioButton; Label1: TLabel; Label2: TLabel; mm2: TMemo; Label3: TLabel; mm3: TMemo; Label4: TLabel; mm4: TMemo; procedure Button4Click(Sender: TObject); procedure Button6Click(Sender: TObject); procedure Button5Click(Sender: TObject); procedure RadioButtonClick(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation uses uDM_DAC; {$R *.dfm} procedure TForm1.Button4Click(Sender: TObject); begin if not Assigned(dm) then dm:= TDM.Create(nil); end; procedure TForm1.Button5Click(Sender: TObject); begin if not Assigned(dm) then Exit; if not dm.FDConnection.Connected then dm.FDConnection.Connected:= True; //在連線池裡獲取一個連線 with dm.FDQuery do begin Close; Case DM.FDBLX of 0: SQL.Text:= mm1.Lines.Text; 1: SQL.Text:= mm2.Lines.Text; 2: SQL.Text:= mm3.Lines.Text; 3: SQL.Text:= mm4.Lines.Text; End; Open; end; ShowMessage(IntToStr(dm.FDQuery.RecordCount)); DM.FDConnection.Connected:= False; //歸還連線 不是斷開 end; procedure TForm1.Button6Click(Sender: TObject); begin if Assigned(dm) then FreeAndNil(dm); end; procedure TForm1.RadioButtonClick(Sender: TObject); begin if not Assigned(dm) then begin ShowMessage('資料模組未初始化!'); Exit; end; if DM.DBChanged(TRadioButton(Sender).Tag) then ShowMessage('資料庫連線切換成功!') else ShowMessage('資料庫連線切換失敗!'); end; end.
4. 資料模組程式碼如下:
unit uDM_DAC;
interface
uses
SysUtils, Classes, FireDAC.Stan.Intf, FireDAC.Stan.Option, FireDAC.Stan.Error,
FireDAC.UI.Intf, FireDAC.Phys.Intf, FireDAC.Stan.Def, FireDAC.Phys,
FireDAC.Comp.Client, FireDAC.Phys.MSSQLDef, FireDAC.Phys.ODBCBase,
FireDAC.Phys.MSSQL, FireDAC.VCLUI.Wait, FireDAC.Comp.UI, FireDAC.Stan.Pool,
FireDAC.Stan.Async, Data.DB, FireDAC.Stan.Param, FireDAC.DatS,
FireDAC.DApt.Intf, FireDAC.DApt, FireDAC.Comp.DataSet, FireDAC.Phys.MySQLDef,
FireDAC.Phys.MySQL, FireDAC.Stan.ExprFuncs, FireDAC.Phys.SQLiteDef,
FireDAC.Phys.SQLite, FireDAC.Phys.OracleDef, FireDAC.Phys.Oracle;
type
TDM = class(TDataModule)
FDManager: TFDManager;
SQLLink: TFDPhysMSSQLDriverLink;
WaitCursor: TFDGUIxWaitCursor;
FDConnection: TFDConnection;
FDQuery: TFDQuery;
MYSQLLINK: TFDPhysMySQLDriverLink;
SQLITELINK: TFDPhysSQLiteDriverLink;
ORACLELINK: TFDPhysOracleDriverLink;
procedure DataModuleCreate(Sender: TObject);
private
{ Private declarations }
function GetCode(iType: Integer; var sCode: string): Boolean;
public
{ Public declarations }
//0 Sqlserver 1 Mysql 2 Sqlite 3 Oracle 預設0
FDBLX: Integer;
function DBChanged(iType: integer): Boolean;
end;
var
DM: TDM;
implementation
{$R *.dfm}
procedure TDM.DataModuleCreate(Sender: TObject);
begin
FDBLX:= 0;
FDConnection.ConnectionDefName:= 'MSSQL_Pool';
end;
function TDM.DBChanged(iType: integer): Boolean;
var
sCode: string;
begin
Result:= False;
if iType= FDBLX then
begin
Result:= True;
Exit;
end;
try
if GetCode(iType, sCode) then
begin
FDConnection.ConnectionDefName:= sCode;
FDBLX:= iType;
Result:= True;
end;
except
on e: Exception do
Exit;
end;
end;
function TDM.GetCode(iType: Integer; var sCode: string): Boolean;
begin
Result:= False;
case iType of
0: begin
sCode:= 'MSSQL_Pool';
Result:= True;
end;
1: begin
sCode:= 'MySQL_Pool';
Result:= True;
end;
2: begin
sCode:= 'SQLite_Pool';
Result:= True;
end;
3: begin
sCode:= 'Oracle_Pool';
Result:= True;
end;
else
//
end;
end;
end.
需要注意的是, 連線MySQL的時候, 還需要兩個dll驅動, 在原始碼連線裡有.
由於本機沒有安裝Oracle, 就沒有寫Oracle的連線了