BDE的DataBase控件有HandShare属性和TSession控件,而DBExpress却没有,如果用
DBExpress做多层的中间层的话,需要注意哪些地方呢?请大家介绍自己的经验.
谢谢!

解决方案 »

  1.   


    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的入门技术做一简要简要介绍,希望对读者有所帮助。
      

  2.   

    不錯!
    dbExpress 是有如上缺點, 不過与ClientDataSet搭配使用什么問題都迎刃而解了!!!!!
      

  3.   

    Delphi 7的dbExpress已经提供了MS SQL Server的驱动
      

  4.   

    有谁知道DBExpress是否具有BDE中的HandShare和Session的功能?
      

  5.   

    楼上。dbexpress不用bde的那些东西
      

  6.   

    结合ClientDataset,就什么都解决了
      

  7.   

    试了一下SQL SERVER的,好象事务管理有些问题,更新数据时也有些问题,
    当插入一条数据时,总是多了些字符的。当一个事务开始,当还没结束时发生异常时,数据应该是不生效的,但发现数据这时已写如了数据库。用ADO没出现这种情况,或者是我对这种技术还不是很了解的缘故吧
      

  8.   

    delphi1999(藤原豆腐店)说得有道理,用DBExpress做查询,用ADO进行数据更新是个不错的主意。
      

  9.   

    可以同时使用DBExpress和ADO吗,我用的是SQL Server2000, 正准备转用DBExpress,但不知道它的SQL Server驱动是不是可靠,正想问问各位有经验的
    大哥
      

  10.   

    我现在的一个项目刚开始时也想用DBExpress的,但后来DBExpress的SQL Server驱动有点问题,我每次插入数据后发现总是多了个字符的,但查询时结果却是正确的,不知为何,同时SQL Server事务管理方面也有点问题。所以后来还是改用ADO了。
      

  11.   

    插入数据后发现总是多了个字符的问题已经解决,D7的SP1主要就是解决SQL Server DBExpress Driver 的问题。不过要注册用户才可下载啊
      

  12.   

    顺便问一句,我下载的D7怎么不支持CORBA?
      

  13.   

    db2cli.dll是什么文件?
    我找你的第一部分写了怎么报这个错?
    unable to load db2cli.dll
      

  14.   

    dbExpress还是不够成熟,我最近在一个多线程应用中碰到大麻烦,上Borland新闻组才知道dbExpress不是线程安全的,最好还是不要在多层应用中用它,继续用ADO吧。
    包括用那个最新的dbexpmss.dll驱SQL SERVER还是会有问题,如NVARCHAR类型就不能访问,另最新的dbexpmss.dll可以在我主页上下到:http://msrc.126.com
      

  15.   

    李维已经出了关于dbExpress的新书。大家可以到china-pub上下载到前三章去看看吧!
      

  16.   

    书名:Delphi 7高效数据库程序设计 
      

  17.   

    DBEXPRESS比ADO的中间层至少快一秒!!
    呵呵!!
      

  18.   

    to THXK(THXK):
    怎么才快一秒?如果是千万数量级的,起码快两到三倍!!不过只是指查询部分,如果是数据更新,建议还是用ADO