• Delphi(Tuxedo,BDE,ADO)三合一数据集组件HsTxQuery


    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)都能够封装成易用的组件,使开发员生活更美好。

    开发样例请增加QQ群:69024049 进行索取和讨论。

  • 相关阅读:
    [CF1365D] Solve The Maze
    [CF478C] Table Decorations
    [CF466D] Increase Sequence
    [CF449D] Jzzhu and Numbers
    [CF507E] Breaking Good
    [CF337D] Book of Evil
    [CF1253E] Antenna Coverage
    VMware 在 Win10 下开机后死机的解决方案
    [CF1009F] Dominant Indices
    [CF1037E] Trips
  • 原文地址:https://www.cnblogs.com/gcczhongduan/p/4187130.html
Copyright © 2020-2023  润新知