Heim  >  Artikel  >  Datenbank  >  Delphi(Tuxedo,BDE,ADO)三合一数据集组件HsTxQuery

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

WBOY
WBOYOriginal
2016-06-07 16:06:351647Durchsuche

一、背景 为什么要做这个三合一数据集组件呢?以前我们公司用delphi开发的系统大多以ADO,BDE方式来连接数据库,这两套组件使用十分方便和灵活,对成本控制也十分友好,从以前十多年间使用情况来看问题都不大,用户也没有三层架构的要求。但在今年投标大公司

一、背景

为什么要做这个三合一数据集组件呢?以前我们公司用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/

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Vorheriger Artikel:ServerProcessNächster Artikel:web开发性能优化---数据库篇