DBExpress入门 .

——程 健

email: mailto:cjcjc@citiz.net



一、引言

刚才拿到一张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的入门技术做一简要简要介绍,希望对读者有所帮助。  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Delphi 7 是一种集成开发环境(IDE),适用于使用 Object Pascal 编程语言的 Windows 平台。DBExpressDelphi 7 中的一个数据库组件框架,用于与各种数据库进行交互。 UTF-8 是一种编码方式,可表示 Unicode 字符集中的所有字符。它是一种多字节编码方案,可以将所有字符映射为不超过 4 个字节。在 Delphi 7 中,DBExpress 可以处理 UTF-8 编码的字符串。 DBExpress 通过 TSQLConnection 组件连接数据库,并通过 TSQLQuery 组件执行 SQL 语句。连接字符串属性可以指定数据库连接的相关信息,例如数据库驱动、服务器地址、用户名、密码等。但是在 Delphi 7 的 DBExpress 中,默认情况下,连接字符串属性不支持 UTF-8 编码形式的字符串,只支持 ANSI 编码。 要在 Delphi 7 中使用 DBExpress 和 UTF-8 编码,我们可以通过自定义 TSQLConnection 组件的连接字符串属性,手动设置相关参数。可以使用 TStringBuilder 构建连接字符串,然后将其赋值给 TSQLConnection 组件的 ConnectionString 属性。连接字符串应该明确指定使用 UTF-8 编码,如在 URL 参数中添加 "charset=utf8"。 此外,还应确保数据库本身也正确配置为支持 UTF-8 编码。通常可以在数据库管理工具中修改表和字段的字符集为 UTF-8,以确保正确存储和检索 UTF-8 编码的字符串数据。 需要注意的是,Delphi 7 的 DBExpress 已经过时,可能在处理 UTF-8 编码的字符串方面存在一些限制。如果需要更完善和现代化的数据库访问支持,可以考虑升级到更高版本的 Delphi 或使用其他数据库访问框架,例如 FireDAC。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值