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 进行索取和讨论。
Delphi(Tuxedo,BDE,ADO)三合一数据集组件HsTxQuery的更多相关文章
- Delphi中封装ADO之我重学习记录
delphi adodataset ctstatic 数据是缓存在服务器端还是客户端 答:客户端,开启本地缓存功能后,就能数据在本地批量修改后,再批量提交,减少了网络传送 原创,专业,图文 Del ...
- 升讯威ADO.NET增强组件(源码):送给喜欢原生ADO.NET的你
目前我们所接触到的许多项目开发,大多数都应用了 ORM 技术来实现与数据库的交互,ORM 虽然有诸多好处,但是在实际工作中,特别是在大型项目开发中,容易发现 ORM 存在一些缺点,在复杂场景下,反而容 ...
- GitHub开源:升讯威ADO.NET增强组件 sheng.ADO.NET.Plus V1.3
GitHub: https://github.com/iccb1013/sheng.ADO.NET.Plus 早前分享过,当时没有把代码上传到Github,只是通过邮件的形式分享给了部分需要的朋友,最 ...
- 浅谈控件(组件)制作方法一(附带一delphi导出数据到Excel的组件实例)(原创)
来自:http://blog.csdn.net/zhdwjie/article/details/1490741 -------------------------------------------- ...
- Delphi中JSon SuperObject 使用:数据集与JSON对象互转
在delphi中,数据集是最常用数据存取方式.因此,必须建立JSON与TDataSet之间的互转关系,实现数据之间通讯与转换.值得注意的是,这只是普通的TDataset与JSON之间转换,由于CDS包 ...
- WebForm获取GET或者POST参数到实体的转换,ADO.NET数据集自动转换实体
最近在修改维护以前的webform项目(维护别人开发的.....)整个aspx没有用到任何的控件,这个我也比较喜欢不用控件所以在提交信息的时候需要自己手动的去Request.QueryString[] ...
- 用Setup Factory7.0怎样打包delphi的BDE?
BDE打包发布实例操作步骤如下: 使用软件:Setup Factory 7.0打包 把C:\Program Files\Common Files\Borland Shared中的所有文件和你的开发的应 ...
- DELPHI 调用系统 ADO 配置窗体 提高软件易用性
最近DELPHI好像不太景气哦,把自己的代码拿出来晒晒.高手别喷哦. 直接上代码 implementation uses AdoConEd; var saveconnstr:string; proc ...
- Delphi TScrollBar 用于滚动窗口、组件内容
滚动条组件(TScrollBar)此组件是一个Windows滚动条,用于滚动窗口.组件内容.许多控制有滚动条属性,它们把滚动条作为自己的一部分,对于没有完整滚动条的控制,TScrollBar组件提供了 ...
随机推荐
- 雅礼集训1-9day爆零记
雅礼集训1-9day爆零记 先膜一下虐爆我的JEFF巨佬 Day0 我也不知道我要去干嘛,就不想搞文化科 (文化太辣鸡了.jpg) 听李总说可以去看(羡慕)各路大佬谈笑风声,我就报一个名吧,没想到还真 ...
- PKU 2528 Mayor's posters
题意: 一个公告板上面贴海报,宽度都是一样的,长度可能不一样.后面的海报可能把前面的覆盖掉.问最后能看见多少张不同的海报. 思路: 这题原来做过,是用线段树的区间染色写的.记录每个区间是纯色还是杂色. ...
- 熟悉Android开发不得不知道的技巧
博客出自:http://blog.csdn.net/liuxian13183,转载注明出处! All Rights Reserved ! 1.用Eclipse插件将文件批量编码如GBK-UTF-8 用 ...
- 【转】 基于C#.NET的高端智能化网络爬虫 2
[转] 基于C#.NET的高端智能化网络爬虫2 本篇故事的起因是携程旅游网的一位技术经理,豪言壮举的扬言要通过他的超高智商,完美碾压爬虫开发人员,作为一个业余的爬虫开发爱好者,这样的言论我当然不能置之 ...
- Hadoop RPC框架
1.RPC框架概述 1.1 RPC(Remote Procedure Call Protocol)--远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不须要了解底层网络技术的协议. R ...
- sublime配置python
Sublime Text 2作为一款轻量级的编辑器,特点鲜明.方便使用,愈发受到普罗大众的喜爱.我个人近期也開始用了起来.同一时候,我近段时间还在学习Python的相关东西.所以開始用ST2来写Pyt ...
- HBase源代码分析之HRegion上MemStore的flsuh流程(二)
继上篇<HBase源代码分析之HRegion上MemStore的flsuh流程(一)>之后.我们继续分析下HRegion上MemStore flush的核心方法internalFlushc ...
- 开源项目 AllJoyn 基础服务
AllJoyn 基础服务主要包含 Onboarding,Notification 和 Control Panel三个大项. 这三个也是编写App的最基础的,最经常使用的部分. Onboarding 提 ...
- 智课雅思词汇---四、clos和cap和ced是什么意思
智课雅思词汇---四.clos和cap和ced是什么意思 一.总结 一句话总结: cap/capt/cip/cep/ceiv:to take,seize(拿,抓住) cede:to go,yield( ...
- 81.node.js前端html时页面格式错乱解决办法
var http = require("http"); var url = require("url"); var fs = require("fs& ...