设为首页 加入收藏

TOP

Delphi(Tuxedo,BDE,ADO)三合一数据集组件HsTxQuery(一)
2014-11-24 00:41:01 来源: 作者: 【 】 浏览:27
Tags: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:8

首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇redis之如何配置jedisPool参数 下一篇MySQL wait_timeout参数设置与网..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: