Delphi(Tuxedo,BDE,ADO)三合一資料集組件HsTxQuery,tuxedohstxquery
Delphi(Tuxedo,BDE,ADO)三合一資料集組件HsTxQuery
一、背景
為什麼要做這個三合一資料集組件呢?以前我們公司用delphi開發的系統大多以ADO,BDE方式來串連資料庫,這兩套組件使用十分方便和靈活,對成本控制也十分友好,從以前十多年間使用方式來看問題都不大,使用者也沒有三層架構的要求。但在今年投標大公司的項目時,往往會被技術要求阻攔,為什麼呢?甲方的標書上寫著要三層架構,這令我們十分頭疼,目前我們公司是使用Tuxedo來做中介層,如果改造,那麼成本預計是一年的時間,二個版本的維護成本也是十分高昂。面對這種情況,我提出三合一的思路,即構建新資料集組件。新組件相容以前Query的全部屬性和方法,只需使用UE編輯器替換以前Query類就可以了,並可以在Tuxedo,BDE,ADO三種串連方式間進行切換,系統也不用另外維護一個版本。思疏才淺,希望大家多多指教,感激不盡。
二、組件結構圖
從結構圖中可以看到使用了裝飾模式,HsTxQuery將使用者的訪問對象放在了自己的身後,根據串連方式轉寄給不同對象。它訪問Tuxedo是通過HsTxQuery.dll訪問,中間有一層轉換,而BDE、ADO是直接連接。
三、設計類
四、例子
1、 開啟
procedure TForm1.Button7Click(Sender: TObject); begin HsQuery2.close; HsQuery2.SQL.Text := 'select * from users'; HsQuery2.Open; end; |
2、 執行
procedure TForm1.Button7Click(Sender: TObject); begin HsQuery2.close; HsQuery2.SQL.Text := 'insert test value(1,2,3)'; HsQuery2. ExecSQL; end; |
3、 插入記錄
procedure TForm1.Button9Click(Sender: TObject); var ms : TMemoryStream; begin ms := TMemoryStream.Create; Image2.Picture.Graphic.SaveToStream(ms); with HsQuery2 do begin database.StartTransaction; Append; HsQuery2.FieldByName('f1').AsString := FormatDateTime('YYYYMMDDHHMMSS',now); HsQuery2.FieldByName('f2').AsString := FormatDateTime('YYYYMMDD',now); HsQuery2.FieldByName('f3').AsString := FormatDateTime('HHMMSS',now); HsQuery2.FieldByName('f4').AsString := '瀟洒哥'; HsQuery2.FieldByName('f5').AsString := '1'; HsQuery2.FieldByName('f6').AsString := '330102199001164317'; HsQuery2.FieldByName('f7').AsString := '1'; HsQuery2.SetBlobStream(HsQuery2.FieldByName('fPHOTO'),ms); Post; ApplyUpdates; CommitUpdates; database.Commit; end; ms.Free; end; |
4、 更新記錄
procedure TForm1.Button10Click(Sender:TObject); var ms: TMemoryStream; begin ms:= TMemoryStream.Create; Image2.Picture.Graphic.SaveToStream(ms); HsQuery2.Edit; HsQuery2.Fields.Fields[0].AsString := '6'; HsQuery2.Fields.Fields[1].AsInteger := 198; HsQuery2.Fields.Fields[2].AsString := ''; HsQuery2.Fields.Fields[3].AsString := 'Roy'; HsQuery2.Fields.Fields[4].AsString := '1'; HsQuery2.Fields.Fields[5].AsString := '2'; HsQuery2.SetBlobStream(HsQuery2.Fields.Fields[6],ms); HsQuery2.Post; HsQuery2.ApplyUpdates; HsQuery2.CommitUpdates; ms.Free; end; |
5、 刪除記錄
6、 存/取Blob資料
存,查看插入例子。
procedure TForm1.Button8Click(Sender: TObject); var Stream:TMemoryStream; Jpg:TjpegImage; begin Stream:=HsQuery2.GetBlobStream(HsQuery2.FieldByName('DATA')) ; Jpg:=TjpegImage.Create ; Stream.Position :=0; jpg.LoadFromStream(Stream); // 載入圖片 image2.Picture.Assign(Jpg); end; |
7、 擷取欄位值
procedure TForm1.Button15Click(Sender: TObject); begin ShowMessage(hsQuery2.FieldByName('userid').AsString); ShowMessage(hsQuery2.Fields.Fields[0].AsString); end; |
8、 過濾
//下面是過濾 hsQuery2.Filter := 'userid=102'; hsQuery2.Filtered := true; //下面是反過濾 hsQuery2.Filter := ''; hsQuery2.Filtered := true; |
9、 參數
/ procedure TForm1.Button16Click(Sender: TObject); begin with hsquery2 do begin close; sql.clear; sql.Text := 'Select * From users where USERID = :id'; ParamByName('id').value := 106; open; end; end; |
10、 Tuxedo、BDE和ADO模式動態切換
/ procedure TForm1.ComboBox1Change(Sender: TObject); begin case combobox1.ItemIndex of 0 : begin hsQuery2.DatasetType := dtTuxedo; hsQuery2.ConnectionString := '//192.168.1.121:8887'; end; 1 : begin hsQuery2.DatasetType := dtBDE; hsQuery2.ConnectionString := 'orcl'; hsQuery2.Connection := Database1; end; 2 : begin hsQuery2.DatasetType := dtADO; hsQuery2.ConnectionString := 'Provider=OraOLEDB.Oracle.1;Password=gf;Persist Security Info=True;User ID=gf;Data Source=orcl;Extended Properties=""'; hsQuery2.Connection := ADOConnection1; end; end; end; |
五、展望
很多進行資料換的中介軟體(如各種MQ)都可以封裝成易用的組件,使開發員生活更美好。
控制項地址:https://sourceforge.net/projects/hstxqueryfordelphi/
delphi7 ADO與BDE控制群組 不見
在控制項面板中點擊右鍵,在開啟的屬性對話方塊中可以調整。
Delphi中BDE控制項query代碼怎轉換成ADO中adoquery代碼? 代碼如下
with ADOQUEYR do
begin
Close;
ADOQUEYR .parameters[0].value := trim(edit1.Text);
ADOQUEYR .parameters[1].value := trim(edit2.Text);
ADOQUEYR .parameters[2].value := trim('user');
execsql;
ADOQUEYR 的內容 insert into 使用者 values(:A,:B,:C) 使用者 使用者表是不是只有3個欄位?