DBExpress 入门
——
email: mailto:cjcjc@citiz
一、引言
刚才拿到一张Delphi 6的企业版,我最关心的无疑是其新增强大的Web支持和全新的数据存取技术(dbExpress)。本文就dbExpress技术做一简要讨论。
二、简介(Overview
dbExpress是在Kylix中首先引进的一种极其快速、小巧、易发布的SQL数据库存储技术。由于它摆脱了传统的数据存取方式,完全摆脱了,BDE/IDAPIADOODBC等存取数据方式,而且是目前在Kylix中存取数据库的唯一方法,所以,它是一种真正跨平台的数据库存取技术,尤其适合开发多层(N-Tierddb2数据库sql语句)应用。
dbExpress为每一种其支持的数据库撰写具有统一接口的dbExpress驱动程序,所以,当你发
dbExpress饮用程序时,必须同时发布此驱动程序(一个DLL文件)。目前,dbExpress支持一下数据库:InterBaseDB2OraclemySQL。很可喜,我最常用的MSSQL Server没有被支持、不过,仔细想想Microsoft数据存取技术的,这也就不难理解了。
三、单向数据集(Unidirectional Dataset
为什么dbExpress那么快?答案是,它使用了单向数据集。它提供了一种高速、轻巧的存取数据库信息的技术,它能够向数据库服务器发送SQL指令,如果返回数据,它也能够获得访问这些数据的游标。但是,它只能处理单向、只读的游标、它不在内存中进行数据缓存,这样可以提高数据存取速度并使用最少的资源。天下没有不要钱的午餐,由于使用了这种单向技术,dbExpress相对与原来的TDataSet,有了不少限制、
四、dbExpress的限制(Limitation
1、在数据集中导航(即在数据集中跳转)的方法只省下FirstNext。大多数其它方法都会导致产生异常。其它(比如GotoBookMark)什么都不做。
2、你无法直接对数据集进行修改,CanModify属性永远是false,如果你想用什么Edit之类的
方法对其进行编辑,那都是徒劳的。你应该已经想到直接用一条UPDATE便可解决了吧?
3、数据过滤不能用了,当然,直接用SELECTWHERE子句吧。
4、最讨厌的是Lookup Field不能用了,如果你习惯用它,那真的是很麻烦。用JOIN吧……
五、dbExpress数据存取控件
Delphi 6提供了以下四种dbExpress数据存取控件: TSQLDataSetTSQLQueryTSQLTableTSQLStoredProc(图1)。
1 dbExpress控件
一般我们推荐用TSQLDataSet,因为它通用,即可以向数据库服务器发送命令,也可以处理任何数据。其它三个应该都可以相向了,是让用惯了TTableTQueryTStoredProc的用户可以比较好上手,也可以比较容易的把以前的程序迁移到dbExpress
1:不要以为这四个控件有什么互相从属关系,它们都是从TSQLCustomDataSet继承下来的。
六、dbExpress程序一般构架——第一个dbExpress程序
正如BDE需要TDatabaseADO需要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;一个TlistViewViewStyle属性为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