Delphi(Tuxedo,BDE,ADO)三合一資料集組件HsTxQuery,tuxedohstxquery

來源:互聯網
上載者:User

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、  刪除記錄

 HsQuery2.Delete;

 

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個欄位?
 

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.