连接数据库,用BDE还是ADO?
一、Delphi数据库连接
如上一章所述,以一定的结构格式存储数据的一个或多个表的集合,称之为一个数据库。表内的数据以行和字段的形式表现。当数据库由两个或两个以上的表构成时,这些表通常储存着分散但相关的数据。MS Access、Interbase或SQL Server使用单个文件表示完整的数据库(如Access的.mdb文件)。而Paradox和dBase数据库则定义了不同的文件和索引来表示表和表的关系。描述一个Paradox数据库所需的全部文件通常被存储在一个单独的目录里。当然,Delphi在这两种模式下都能工作。
Delphi能访问不同类型的数据库:local(本地)或C/S(客户机/服务器)(远程服务器)数据库。本地数据库指存放在你的本地驱动器或局域网上。远程数据库服务器通常位于远程计算机上。本地数据库类型的有Paradox、dBase和MS Access。客户机/服务器数据库类型的有MS SQL Server、Interbase和Oracle。
本地数据库通常被称为单层数据库。单层数据库指一个数据库中的任何更改都立即发生,如编辑数据、插入或删除记录。单层数据库中,表能容纳多少数据以及应用程序能支持多少用户,是有限的。当数据信息包含的多个表之间存在复杂关系,或客户数量急剧增长时,你可能需要构建两层或多层结构的应用程序。客户端应用程序在本地计算机运行,应用服务器(通过很多协议来为客户端提供{serves}商业逻辑--可调用{call}的方法{methods})通常在服务器上,数据库本身可能会在另一台服务器上{提供数据更改服务}。多层架构背后的理念是使用应用服务器来做大部分的工作,而尽量缩小客户端。这允许我们编写那些被称作瘦客户端的应用程序。
当我们用Delphi编写一个数据库应用程序时,我们需要使用一些数据库引擎来访问数据库中的数据。数据库引擎--允许你专注于需要访问哪些数据,而非如何访问它。从第一版开始,Delphi就为开发人员提供了BDE(Borland数据库引擎);此外,从第五版开始,提供了对微软ADO数据库接口的支持。
本课程将主要讲解使用MS Access本地数据库创建单层应用。
二、数据库引擎
BDE为Borland公司旗下产品(包括Delphi和C Builder)提供了一个通用的数据访问层,由一系列DLL集合和实用工具构成。BDE的优点在于--所有的数据操作对开发人员来说都是“透明”的; BDE自带一系列数据库驱动器,使你的应用程序能与几种不同类型的数据库进行交互。这些驱动将高层次的数据库操作(比如open、post)或业务流(记录锁、SQL分布式创建)转化为具体到某个特定数据库(Paradox,dBASE,MS Access或任何ODBC数据源)类型的底层指令。BDE API(应用编程接口)包含200多个过程和函数,都可从BDE单元中获得。幸运的是,我们再也不用直接去调用这些例程了,而是通过使用Data Access面板下VCL的BDE数据访问组件。要访问特定数据库,应用程序只需要知道该数据库的别名,即可访问该数据库中的所有数据。别名在BDE管理器(BDE Administrator)中设置,它指定了驱动器的参数和数据库的位置。BDE自带一个数据库驱动集,能够访问多种数据源。标准的BDE驱动集包括Paradox,DBASE,MS Access,ASCII文本。同时,BDE能通过ODBC管理器使用ODBC的驱动。
使用BDE访问数据库的Delphi应用程序,需要同时发布BDE。因此,进行应用程序部署时,必须使用InstallShield Express或其他Borland认证的安装程序。BDE作为数据库引擎有其优点和缺点。但是,在此我不打算讨论,你什么时候应该使用BDE(相比于其他引擎),以及为什么使用它,而不是其他的非BDE技术。
既然本课程是讨论ADO/MSACCESS的,那么剩余部分将侧重于非BDE数据库引擎的访问方法。
如《Delphi中引入ADO》所述,ADO是一组COM组件(DLLs){COM -- Component Object Model组件对象模型组件},它允许你像访问电子邮件和文件系统一样访问数据库。ADO组件构建的应用程序不需要BDE。使用ADO访问数据库,你需要有ADO/OLE DB库{OLE -- Object Linking and Embedding对象链接和嵌入}。若使用的是Windows操作系统,其所需文件已存在于系统中。最好使用从微软官方网站获得的MDAC最新版本。MDAC是使Universal Data Access(通用数据访问)起作用的关键技术,包括ActiveX Data Objects(ADO)、OLE DB和Open Database Connectivity(ODBC)。在这里没有必要过多的讨论OLE DB和ADO,让我们转移到更实际的问题上。
三、ADO对象(ADO Objects)
ADO编程模型基于若干ADO对象构建,这些对象提供多种访问各类数据源的方法--连接数据源、查询和更新记录集、报告错误等。Delphi通过几个封装好的VCL组件来访问这些对象。让我们来看看与ADO一起工作的对象有哪些:
Connection(连接)对象,通过连接字符串与数据源连接。在BDE/Delphi中,连接对象由数据库组件和会话(Session)组件的组成;
Command(命令)对象,使我们能够操作数据源。它描绘了一个命令(也称为查询或语句),对数据库中的数据进行增加、删除、查询或更新处理;
Recordset(记录集)对象,是查询(Query)命令的结果。你可以将它视为一个Delphi表(Table)或查询组件,其 返回的每一行都包含多个字段(Field)对象。
其他几个在ADO模型中存在的对象有:字段(Field)对象、参数(Parameter)对象和错误(Error)对象—在接下来的章节中我们会回过来谈到它们。
四、使用ADOExpress连接数据库
在对ADOExpress集合中的每个组件进行简要说明前,让我们首先了解一下如何连接到Access数据库。当然,将用到我们上章创建好的样例数据库—AboutDelphi.mdb。
Delphi主要通过组件面板ADO页上的ADOExpress组件实现对ADO的支持。在本课程中将使用几个其他的数据库组件。眼下,我们将重点放在用ADO能访问Access数据库所需的最小组件集上。
运行Delphi,即会建立一个带有空白窗口的应用程序。
为了能通过ADO访问Access数据库的数据,你必须在你的工程中添加至少三个数据感知组件(data aware)。首先是DataControls(数据控制)组件页的DBGrid —- 用于浏览从一个表格或通过查询获得的记录。其次是DataAccess(数据访问)页的DataSource,用于连接数据集和窗口上的DBGrid组件,从而显示、导航(navigation)和编辑相关数据集的数据。最后是ADO页的ADOTable,表示对ADO数据库检索后获得的一个表。将它们拖放进窗口(Form),都使用默认的组件名。窗口如图所示:
如果你现在运行程序,Grid中将无任何数据显示 —- 那是因为,我们还没真正地连到数据库上。注意另一点:仅仅Grid是可见的,其他两个是不可视控件(controls-unvisible)。
五、组件间的连接(Link between components)
为了显示数据库中的数据,我们必须把三个组件关联在一起。在对象监视器(Object Inspector)中进行如下设置:DBGrid1.DataSource = DataSource1;
DataSource1.DataSet = ADOTable1 ;
我们现在已经到了最困难的部分 -- 为了真正从数据库中获得数据,我们必须建立一个连接字符串(ConnectionString)。这个字符串指出了数据库的物理存储位置和访问方式。当你双击AdoTable组件的ConnectionString属性的...省略号按钮。
建立一个连接字符串,我们有两种选择:使用数据连接文件(.UDL)或手工建立一个连接字符串。现在我们手工建立它,点击Build按钮--弹出Data Link Properties(数据连接属性)对话框。这个对话框有4页。Provider(提供商)页允许你指定提供商—这里选择Microsoft Jet 4.0 OLE DB Provider。点击Next进入第二页:Connection(连接)。点击...按钮浏览并找到我们的数据库(AboutDelphi.mdb)。可点击Test Connection(测试连接)按钮来检验是否连接成功 —- 这里应该是成功的。其它页暂时不进行设置。最后,点两次OK,以关闭对话框 —- 连接字符串被存储在ADOTable组件的ConnectionString属性中。连接字符串如下所示:Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\Database\About\aboutdelphi.mdb;Persist Security Info=False
最后,必须设置通过ADOTable组件所访问的表的名称 -- 再次使用Object Inspector: ADOTable1.TableName = Applications ;
若想设计时就看见数据库中的数据,可将ADOTable的Active(激活)属性设置为True。
完成以上步骤后,你将能在DBGrid中看到Applications表的一行记录。运行时,你甚至能改变数据库的数据。当然,你无法做更多的事 -— 这是我所能想到的最简单的ADO的例子。
下一章,我们将针对Delphi提供的所有ADO组件,讨论它们怎样与其他数据感知组件进行通讯,从而创建功能更为强大的Delphi数据库应用程序。