BDE的DataBase控件有HandShare属性和TSession控件,而DBExpress却没有,如果用
DBExpress做多层的中间层的话,需要注意哪些地方呢?请大家介绍自己的经验.
谢谢!
DBExpress做多层的中间层的话,需要注意哪些地方呢?请大家介绍自己的经验.
谢谢!
解决方案 »
- 求教
- 为何发生ocx异常就会导致主程序崩溃?
- 请问如何查找某个会员曾参与过的贴子
- 一个{$DEFINE XXX}编译指令怎么让所有涉及到的文件都起作用?
- 唉!鬱悶呀!散分!
- 图像读出问题
- 用DELPHI怎么写进Ring0
- 有这样的一个题:就是如何用delphi控制某一网页中<Form>元素中的Action提交,当然我也可能控制<Form>表单中元素的值,比如<Input type='t
- 如何解决在Delphi中使用ADOQuery控件进行插入操作时产生的错误?
- 关于在Richedit中的光标定位问题,在线等! 已经问了遍啦
- Panel控件在改变大小时如何令它刷新而不留痕迹?!
- dbgrig里面的数据怎么样做连接啊?
DBExpress 入门 ——程 健email: mailto:[email protected] 一、引言刚才拿到一张Delphi 6的企业版,我最关心的无疑是其新增强大的Web支持和全新的数据存取技术(dbExpress)。本文就dbExpress技术做一简要讨论。 二、简介(Overview)dbExpress是在Kylix中首先引进的一种极其快速、小巧、易发布的SQL数据库存储技术。由于它摆脱了传统的数据存取方式,完全摆脱了,BDE/IDAPI、ADO、ODBC等存取数据方式,而且是目前在Kylix中存取数据库的唯一方法,所以,它是一种真正跨平台的数据库存取技术,尤其适合开发多层(N-Tierd)应用。dbExpress为每一种其支持的数据库撰写具有统一接口的dbExpress驱动程序,所以,当你发布dbExpress饮用程序时,必须同时发布此驱动程序(一个DLL文件)。目前,dbExpress支持一下数据库:InterBase、DB2、Oracle、mySQL。很可喜,我最常用的MS-SQL Server没有被支持、不过,仔细想想Microsoft数据存取技术的,这也就不难理解了。 三、单向数据集(Unidirectional Dataset)为什么dbExpress那么快?答案是,它使用了单向数据集。它提供了一种高速、轻巧的存取数据库信息的技术,它能够向数据库服务器发送SQL指令,如果返回数据,它也能够获得访问这些数据的游标。但是,它只能处理单向、只读的游标、它不在内存中进行数据缓存,这样可以提高数据存取速度并使用最少的资源。天下没有不要钱的午餐,由于使用了这种单向技术,dbExpress相对与原来的TDataSet,有了不少限制、 四、dbExpress的限制(Limitation)1、在数据集中导航(即在数据集中跳转)的方法只省下First和Next。大多数其它方法都会导致产生异常。其它(比如GotoBookMark)什么都不做。2、你无法直接对数据集进行修改,CanModify属性永远是false,如果你想用什么Edit之类的方法对其进行编辑,那都是徒劳的。你应该已经想到直接用一条UPDATE便可解决了吧?3、数据过滤不能用了,当然,直接用SELECT的WHERE子句吧。4、最讨厌的是Lookup Field不能用了,如果你习惯用它,那真的是很麻烦。用JOIN吧…… 五、dbExpress数据存取控件Delphi 6提供了以下四种dbExpress数据存取控件: TSQLDataSet、TSQLQuery、TSQLTable、TSQLStoredProc(图1)。图 1 dbExpress控件一般我们推荐用TSQLDataSet,因为它通用,即可以向数据库服务器发送命令,也可以处理任何数据。其它三个应该都可以相向了,是让用惯了TTable、TQuery、TStoredProc的用户可以比较好上手,也可以比较容易的把以前的程序迁移到dbExpress。注1:不要以为这四个控件有什么互相从属关系,它们都是从TSQLCustomDataSet继承下来的。 六、dbExpress程序一般构架——第一个dbExpress程序正如BDE需要TDatabase。ADO需要TADOConnection一样,dbExpress提供了TSQLConnection控件,我们在dbExpress程序中,首先需要放置TSQLConnection控件,使其连接到数据库,然后再用数据存取控件来访问数据。下面,我们就来建立我们第一个dbExpress应用程序。我们假定您安装并启动了Interbase 6服务器,并有默认的IBLOCAL别名。1、运行Delphi6 Profasional或者Enterprise版,File->New->Application;2、放置一个Tedit,其Text属性为select * from CUSTOMER;一个Tbutton,其Caption属性为Go;一个TlistView其ViewStyle属性为vsReport;一个TSQLConnection;一个TSQLDataSet,其SQLConnection属性为刚才放置的SQLConnection1。见图2。图 2程序的初步设置 3、双击SQLConnection1,出现dbExpress Connection对话框,在Connection Name中选择ibLocal,确定右边的Database项中的数据库名正确,见图3。图 3 dbExpress Connections对话框4、双击Button1,在OnClick中输入如下代码:procedure TForm1.Button1Click(Sender: TObject);var i, j:Integer;begin //判断是否有SQL语句 if Edit1.Text = '' then begin ShowMessage('No SQL Statement!'); exit; end; //执行SQL语句 if SQLDataSet1.Active then SQLConnection1.Close; SQLDataSet1.CommandText := Edit1.Text; SQLDataSet1.Open; //根据返回的数据集调整TListView控件 ListView1.Items.Clear; ListView1.Columns.Clear; for i := 0 to SQLDataSet1.Fields.Count do with ListView1.Columns.Add do if i = 0 then Caption := 'NO.' else Caption := SQLDataSet1.Fields[i - 1].DisplayLabel ; j := 1; //显示数据 SQLDataSet1.First; while not SQLDataSet1.Eof do begin with ListView1.Items.Add do begin Caption := IntToStr(j); for i := 0 to SQLDataSet1.Fields.Count - 1 do SubItems.Add(SQLDataSet1.Fields[i].AsString); end; inc(j); SQLDataSet1.Next; end;end;5、保存并运行程序(图4),你可以输入任何有效的SELECT语句,查阅有关数据。图 4 第一个dbExpress实例运行情况七、不返回数据集的SQL语句我们可以用ExecSQL语句来处理不返回数据集的SQL语句,我们可以通过修改上面的实例来验证这一点。修改Button1Onclick中的代码如下:procedure TForm1.Button1Click(Sender: TObject);var i, j:Integer;begin //判断是否有SQL语句 if Edit1.Text = '' then begin ShowMessage('No SQL Statement!'); exit; end; //执行SQL语句 if SQLDataSet1.Active then SQLConnection1.Close; //NEW SQLDataSet1.CommandText := TrimLeft(Edit1.Text); if UpperCase(copy(SQLDataSet1.CommandText,1,6)) <> 'SELECT' then begin //if not a select statement so it does not return data SQLDataSet1.ExecSQL; ShowMessage('Statement executed'); Exit; end; SQLDataSet1.Open; //根据返回的数据集调整TListView控件 ListView1.Items.Clear; ListView1.Columns.Clear; for i := 0 to SQLDataSet1.Fields.Count do with ListView1.Columns.Add do if i = 0 then Caption := 'NO.' else Caption := SQLDataSet1.Fields[i - 1].DisplayLabel ; j := 1; //显示数据 SQLDataSet1.First; while not SQLDataSet1.Eof do begin with ListView1.Items.Add do begin Caption := IntToStr(j); for i := 0 to SQLDataSet1.Fields.Count - 1 do SubItems.Add(SQLDataSet1.Fields[i].AsString); end; inc(j); SQLDataSet1.Next; end;end; 八、主要/明细(Master/Detail)除了以上限制(那些限制有时还真的是很麻烦),你以前在BDE中使用的技巧都能在dbExpress中使用。比如,你可以使用以前的技术建立Master/Detail的关系——如果你使用SQLTable,那么使用其MasterSource,MasterField属性;如果你使用TSQLQuery,那么可以使用一个参数来传递信息。在MstDtl1和MstDtl2分别演示了这两种技术(图5,6)。由于使用了单向数据集,我们无法使用TDBGrid控件,也无法在DBNavigator中使用除了First和Next之外的按钮。不过值得注意的是,当你在Master表中使用了First后,会出现问题,需要Reopen Detail表才行。图 5主要/明细实例图 6主要/明细实例 九、结束语本文就dbExpress的入门技术做一简要简要介绍,希望对读者有所帮助。
dbExpress 是有如上缺點, 不過与ClientDataSet搭配使用什么問題都迎刃而解了!!!!!
当插入一条数据时,总是多了些字符的。当一个事务开始,当还没结束时发生异常时,数据应该是不生效的,但发现数据这时已写如了数据库。用ADO没出现这种情况,或者是我对这种技术还不是很了解的缘故吧
大哥
我找你的第一部分写了怎么报这个错?
unable to load db2cli.dll
包括用那个最新的dbexpmss.dll驱SQL SERVER还是会有问题,如NVARCHAR类型就不能访问,另最新的dbexpmss.dll可以在我主页上下到:http://msrc.126.com
呵呵!!
怎么才快一秒?如果是千万数量级的,起码快两到三倍!!不过只是指查询部分,如果是数据更新,建议还是用ADO