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 进行索取和讨论。

Delphi(Tuxedo,BDE,ADO)三合一数据集组件HsTxQuery的更多相关文章

  1. Delphi中封装ADO之我重学习记录

    delphi adodataset ctstatic 数据是缓存在服务器端还是客户端 答:客户端,开启本地缓存功能后,就能数据在本地批量修改后,再批量提交,减少了网络传送   原创,专业,图文 Del ...

  2. 升讯威ADO.NET增强组件(源码):送给喜欢原生ADO.NET的你

    目前我们所接触到的许多项目开发,大多数都应用了 ORM 技术来实现与数据库的交互,ORM 虽然有诸多好处,但是在实际工作中,特别是在大型项目开发中,容易发现 ORM 存在一些缺点,在复杂场景下,反而容 ...

  3. GitHub开源:升讯威ADO.NET增强组件 sheng.ADO.NET.Plus V1.3

    GitHub: https://github.com/iccb1013/sheng.ADO.NET.Plus 早前分享过,当时没有把代码上传到Github,只是通过邮件的形式分享给了部分需要的朋友,最 ...

  4. 浅谈控件(组件)制作方法一(附带一delphi导出数据到Excel的组件实例)(原创)

    来自:http://blog.csdn.net/zhdwjie/article/details/1490741 -------------------------------------------- ...

  5. Delphi中JSon SuperObject 使用:数据集与JSON对象互转

    在delphi中,数据集是最常用数据存取方式.因此,必须建立JSON与TDataSet之间的互转关系,实现数据之间通讯与转换.值得注意的是,这只是普通的TDataset与JSON之间转换,由于CDS包 ...

  6. WebForm获取GET或者POST参数到实体的转换,ADO.NET数据集自动转换实体

    最近在修改维护以前的webform项目(维护别人开发的.....)整个aspx没有用到任何的控件,这个我也比较喜欢不用控件所以在提交信息的时候需要自己手动的去Request.QueryString[] ...

  7. 用Setup Factory7.0怎样打包delphi的BDE?

    BDE打包发布实例操作步骤如下: 使用软件:Setup Factory 7.0打包 把C:\Program Files\Common Files\Borland Shared中的所有文件和你的开发的应 ...

  8. DELPHI 调用系统 ADO 配置窗体 提高软件易用性

    最近DELPHI好像不太景气哦,把自己的代码拿出来晒晒.高手别喷哦. 直接上代码 implementation uses AdoConEd; var  saveconnstr:string; proc ...

  9. Delphi TScrollBar 用于滚动窗口、组件内容

    滚动条组件(TScrollBar)此组件是一个Windows滚动条,用于滚动窗口.组件内容.许多控制有滚动条属性,它们把滚动条作为自己的一部分,对于没有完整滚动条的控制,TScrollBar组件提供了 ...

随机推荐

  1. 【Codeforces Round #423 (Div. 2) B】Black Square

    [Link]:http://codeforces.com/contest/828/problem/B [Description] 给你一个n*m的格子; 里面包含B和W两种颜色的格子; 让你在这个格子 ...

  2. Win7下JDK环境变量设置批处理(转)

    每次重装系统之后,都需要重新设置JDK环境变量 项目中有些入门小白看了网络上的设置环境变量的文章还是会设置错环境变量 提供一个批处理能够在Win7下运行(使用了setx命令),自动设置环境变量. cl ...

  3. MAC 文件加密

    MAC 文件加密 (2011-10-08 00:08:52) 标签: 杂谈 分类: MAC技巧篇 我们都有一些私密的文件需要保存,在苹果操作系统下,如何为这些文件或文件夹设置密码呢? 利用系统自带的创 ...

  4. CAShapeLayer的简单介绍以及基本使用

    1.CAShapeLayer简单介绍  1.1CAShapeLayer继承于CALayer,能够使用CALayer的全部属性值:    1.2CAShapeLayer须要贝塞尔曲线配合使用才有意义(也 ...

  5. 30.angularJS第一个实例

    转自:https://www.cnblogs.com/best/tag/Angular/ AngularJS 通过 ng-directives 扩展了 HTML. ng-app 指令定义一个 Angu ...

  6. OPENCV(7) —— HighGUI

    包括函数createTrackbar.getTrackbarPos.setTrackbarPos.imshow.namedWindow.destroyWindow.destroyAllWindows. ...

  7. Linux 下实现虚拟光驱功能,查看iso文件内容

    1,创建挂载点(也可以不创建,直接用现有的目录) openSUSE:~ # mkdir /mnt/iso 2,挂载ISO文件至创建的挂载点 openSUSE:~ # mount -t iso9660 ...

  8. 第四次python作业——叶耀宗

    设计题2: 1.参考“三国演义”词频统计程序,实现对红楼梦出场人物的频次统计.2.(可选)将红楼梦出场人物的频次统计结果用词云显示. import jieba excludes = {"什么 ...

  9. LRJ入门经典-0906最短公共父串305

    原题 LRJ入门经典-0906最短公共父串305 难度级别:B: 运行时间限制:1000ms: 运行空间限制:256000KB: 代码长度限制:2000000B 试题描述 给定字符串A和字符串B,要求 ...

  10. 【Uva 10118】Free Candies

    [Link]: [Description] 有4堆书; 每本书编号从1..20 每堆书都是N本; 然后每次只能从任意一堆的堆顶拿一本书装到自己的口袋里; 你的口袋最多容纳5本书; 当你的口袋里有两本一 ...