中国程序员联盟 正在重新改版中ing 不便之处还请见谅 改版后将内容涉及java delphi .net php
 
  首页 | 数据库开发 | 网络通讯 | 多线程 | 多媒体开发 | 图像处理 | 程序人生 | 系统函数 | 控件开发 | Web服务
 
  当前位置:笨鱼delphi技术网>数据库开发>代码分析>文章内容

delphi DBExpress 入门

来源:站内 关于:bill 发布时间:2007-06-22   [收藏] [推荐]
一、引言
刚才拿到一张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)。
dbexpress1.bmp (121234 Bytes)
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。
dbexpress2.bmp (667374 Bytes)
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,那么使用其MasterSourceMasterField属性;如果你使用TSQLQuery,那么可以使用一个参数来传递信息。在MstDtl1MstDtl2分别演示了这两种技术(图56)。由于使用了单向数据集,我们无法使用TDBGrid控件,也无法在DBNavigator中使用除了FirstNext之外的按钮。不过值得注意的是,当你在Master表中使用了First后,会出现问题,需要Reopen Detail表才行。
5主要/明细实例
6主要/明细实例
 
九、结束语
本文就dbExpress的入门技术做一简要简要介绍,希望对读者有所帮助

[浏览: 次]   
上一篇:delphi 无状态的中间层的数据存取   下一篇:delphi DBExpress 提高
[收藏] [推荐] [返回顶部] [打印本页] [关闭窗口]  
    评论加载中…
google adsense热点文章
·delphi Delphi_动态数组介绍----Delphi
·delphi 检查IP地址
·delphi DBExpress 提高
·delphi 复制Excel列到二维数组
·delphi Delphi_VCL消息处理机制的内幕
·delphi 产生不重复的随机数
·delphi 如何在DELPHI里调用MS office
·delphi 缓冲池
·delphi MIDAS——多层分布式应用程序服
·delphi Asta多层应用实现
·delphi 在WORD文档里添加页签
·delphi Datamodule的应用方式
     delphi技术网 | firefox 下载 | Avant Browser下载 | dedecms 技术网 | drupal 爱好者 | php 技术网
  Copyright@www.delphichm.com,2006-2009.All Rights Reserved.
 
程序员联盟 | delphi Java .net|QQ:707102932