Delphi数据库处理第一节BDE、ADO、InterBase和dbExpressDelphi中处理数据库主要有两种方法,也就是BDE、ADO,从Delphi6.0开始还加入了一种dbExpress方法。另外,Delphi还提供了专门处理Borland公司自己的数据库产品InterBase数据库的专门的方法。BDE(BorlandDatabasEngine),是Delphi中最古老的技术,从delphi2.0加入BDE技术以后,一直是Delphi处理数据库的事实上的标准。BDE是一个基于驱动程序的体系结构,每一种数据格式或数据源都有一种驱动程序来驱动相近的数据源。BDE可以很好的支持现在最流行的ODBCAPI方法,ODBC是一种C/C++应用程序编程接口(API),无论是对任何一种客户/服务器关系型数据库管理系统(RDBMS),还是最流行索引顺序访问方法(ISAM)数据库(Jet、Foxpro),都能很好的访问。同时,由于BDE的驱动程序主要直接来自于第三方开发商,所以,对于像Oracle这些非微软的数据库,执行效率上比较高。正是这些特点,使BDE技术还是得到了很多数据库开发程序员的欢迎。ADO技术是微软提出来的处理关系型数据库和非关系型数据库的新技术,它基于微软被称为OLEDB的数据访问模式,它是专门为了给大范围商业数据源提供访问而设计的,包括传统的关系型数据表、电子邮件系统、图形格式、Internet资源等。ADO所需内存更少,更适合大流量和大事务量的网络计算机系统。ADO顶层有三个对象:Connection、Command、Recordset。Connection用以指定数据源,建立和数据源的连接。Command对象用以对数剧源执行指定的命令,可以接受SQL语句,表和存储过程的名称,执行SQL查询,更新数据,插入纪录等。Recordset对象表示的是来自表或命令执行结果的记录全集,操纵来自提供者的几乎所有数据。由于ADO技术的迅速普及,从Delphi5.0开始,加入了ADO技术的模块,并逐步成为Delphi数据库设计的主流。但是,和VB的ADODC相比,它还是有所不同的,在数据绑定上,它更多的吸收了BDE的特点,以做到和原来的程序兼容,同时,它又可以接受标准ADO技术的各种属性和方法,在接受这些属性和方法时,它是和数据绑定控件脱离的,当然从某种意义上来说,这种方案提高了执行效率,给设计人员以更多的选择。dbExpress是Delphi6.0加入的最新的数据库模块,它不使用缓存,可以快速浏览大量的数据,但是,不使用缓存就不能更改,所以它的标准方式是只读的。它一个重要的特点是交叉平台,可以和Linux数据库连接,速度相当快。下面的讨论,将以ADO技术为主线,最后再说明BDE和dbExpress的应用方式。第二节ADO面板的主要组件ADO面板一共有7个组件:ADOConnection:主要用于建立数据库的连接;ADOdataSet:ADO提取和操作数据库的主要数据集,可以直接连接到数据库,也可以通过ADOConnection连接到数据库。ADOtable:主要用以操作和提取单个基表的数据,可以直接连接到数据库,也可以通过ADOConnection连接到数据库。ADOquery:通过SQL语言提取数据,其连接数据库的方式和前两种一样。ADOStoredProc:这个组件专门用于运行数据库中的存储过程。ADOCommand:该组件用于运行一些SQL命令,这个组件可以和支持数据集的组件一起使用,也可以直接从一个基表中提取一个数据集。RDSConnection:一个进程或一台计算机传递到另一个进程或计算机的数据集合。为了连接数据绑定控件,上述组件往往要和处于DataAccess中的Datasource配合使用。可以看出,和VB的ADODC不同的,Delphi中解决同一个问题提供了多种方案,看起来似乎增加了麻烦,但是却可以给程序员更大的自由空间,便于设计出高效率的数据库程序来。下面通过几个例子来说明ADO控件的用法。第三节ADOtable组件ADOtable、ADOdataSet、ADOquery和ADOStoredProc都继承同一个父类TCustomADODataSet,所以,在属性事件和方法上有很多相似的地方,但它主要是针对数据库中的表进行操作。ADO-〉ADOtable属性:Name='控件名'ConnectionString='连接字符串'可以通过点击右边的按钮,通过向导建立数据源。有时候需要知道相对路径,可以用下面的方法找到程序当前的路径:tpath:=ExtractFilepath(Application.Exename);文件名:=Tpath+'..\data\Test.mdb'表明数据库在当前程序上一层的Data文件夹下。TableName='表名'Active=true这就激活了数据源,为了和绑定控件联系,要增加一个DadaSource控件。事实上,所有的绑定控件都是和DadaSource联系。DataAccess-〉DadaSource属性:Dataset=ADOtable.Name加入绑定控件:DataControls-〉DBgrid(表格)属性DadaSource='DadaSource.Name'DBNavigator(导航条)属性DadaSource='DadaSource.Name'运行一下可以看出关系下面介绍一下ADOtable的一些重要的方法,这些方法大部分和Table是兼容的。为了便于叙述,ADOtable控件的Name定为ADOtable11)移动指针第一个:ADotable1.First;最后一个:ADotable1.Last;下一个:ADotable1.Next;前一个:ADotable1.Prior;2)从字段中取出数据通过如下方法可以访问字段的值ADOtable1.FieldValues['字段名']ADOtable1.Field[索引值]在读写字段的时候,又是根据需要可以加上强制类型转换例如:Edit1.text:=ADOtable1.Field[0].AsString;用下面的方法可以去除字段的性质:ADOtable1.fielddefs[索引值].name;字段名ADOtable1.fielddefs[索引值].Size;字段大小ADOtable1.fielddefs[索引值].Datatype;字段属性3)修改数据:修改数据的时候,需要先建立EDIT方法,然后用Post方法才能真正的写入。ADOtable1.edit;ADOtable1.FieldValues['姓名']:='王秀琴';ADOtable1.post;4)增加一条空纪录:ADOtable1.append;新增纪录也可以用如下方法,在新增纪录的同时输入数据ADOtable1.appendRecord(xxx,xxx,xxx,....);5)删除当前纪录:ADOtable1.delete;如果在ADOtable1的OnBeforeDelete方法中写下:ifmessagedlg('确实要删除吗?',mtinformation,[mbyes,mbno],0)=mrnothenabort();可以实现删除前的提示。6)过滤可以用如下的方法实现数据的过滤在ADOtable1的OnFilterRecord方法中写下:Accept:=(条件);然后ADOtable1.filtered:=true;为实现过滤。ADOtable1.filtered:=false;为解除过滤。7)指针在文件的头尾指针在最后一条记录之后ADOtable1.Eof指针在第一条记录之前ADOtable1.Bof如此可以实现对数据库的遍历form1.ADOtable1.first;whilenotform1.ADOtable1.eofdoBegin.......form1.ADOtable1.next;End;8)此外,ADOtable组件还继承了ADO中的RecordSet对象几乎全部属性和方法,简述如下:withadoTable1.Recordsetdobegin//属性PageSize一页所包含的记录数PageCount数据的页数AbsolutePage;当前记录所在页AbsolutePosition;当前记录的序号位置BOF;指针在第一个记录之前EOF;指针在最后一个记录之后//方法AddNewfieldList,Values;创建新记录,其中fieldList为用数组表示的字段名集,Values为用数组表示的数据集。Cancel;取消上一步所作的修改UpdateFields,Values;保存对当前记录所作的修改Delete;删除当前记录Move(n);移动n条记录MoveFirst;移动到第一条纪录MoveLast;移动到最后一条纪录MoveNext移动到下一条纪录MovePrevious移动到上一条纪录Requery;通过从新执行对象所基于的查询,以更新RecordSet对象中的数据。end;使用Recordset对象来处理数据集的数据,会发现数据帮定控件的指针一般不会跟着移动,这实际上给设计者提供了另一个在后台快速处理数据的方法。附录:关于TActionList控件的使用在Standard面板,提供了一个TActionList控件,它集中了大部分按钮的使用方法,可以简化按钮的设计。方法:调入TActionList,双击,可以看到一个面板,右键-〉NewStandardAction选择Datasat下的适当的控制,可以选择多个。以后加入的开关,只要在属性Action中选择适当的项目就可以了,不需要专门编程,实例见“ActionList应用”。第四节ADOQuery组件和ADOtable组件一样,ADOquery继承了同一个父类TCustomADODataSet,所以,上面说到的ADOtable属性事件和方法基本上是通用的,但它主要是针对数据库中的SQL命令进行操作。下面主要说一下ADOquery特殊的地方。1)SQL属性SQL是TStrings类型的属性,包含了ADOquery组件要执行的SQL命令,是ADOquery最为重要的属性之一。在应用程序中,需要调用Open方法或者ExecSQL方法来执行在SQL中的命令。在设计阶段,可以利用属性编辑起来编写。例如:WidthADOquerydoBegin//重新写入时,要关闭原来的查询Close;widthSQLdoBegin//因为Add是在原来的基础上加入,所以先清除原来的SQL命令Clear;Add('selsct编号,姓名,奖金')Add('From奖金表')End;//执行SQL命令Open;End;查询命令也可以这样来写:s1:='编号';s2:='姓名';s3:='金额';withADOquery1dobeginsql.Clear;SQL.Add('select');SQL.Add(s1+','+s2+','+s3);SQL.Add('From奖金');execsql;active:=true;end;效果是一样的。第五节ADOConnection和ADODataSet虽然ADOTable和ADOQuery组件可以非常简单的连接数据库,但是当需要更加精细的控制数据库的时候,往往需要应用ADO更多的方法,我们知道,支撑ADO的主要由Connection,Command,Recordsrt三个对象组成,对应的就有ADOConnection和ADOCommand控件,而Recordsrt对象属性和方法,封装在ADODataSet中,同时ADODataSet本身,也具备和ADOtable组件相同的对数据绑定控件控值的属性和方法。这就大大提高了对数据库的控制能力。在ADO顶层有三个对象中Connection处在最顶层,用以指定数据源,建立和数据源的连接。所以,ADOConnection必须和其它的数据控件连接才有效,最常用的就是和ADODataSet配合。下面首先介绍连接方法,然