1、2023年12月12日星期二DELPHI程序设计基础教程第十章 数据库编程基础t本章学习导读t10.1 Delphi数据库编程基础t10.2 数据源组件DataSourcet10.3 数据集组件DataSett10.4 BDE数据集组件t10.5 ADO组件t10.6 数据控制组件t本章小结2023年12月12日星期二DELPHI程序设计基础教程本章学习导读t Delphi最强大的地方就在于对数据库的支持,Delphi可以访问多种数据库管理系统的数据库,可以访问诸如Paradox、dBase、本地InterBase服务器的数据库,也可以访问如Oracle、Sybase等远程数据库服务器上的数据
2、库,或任何经ODBC可访问的数据库管理系统中的数据库。t 本章首先对Delphi数据库的编程基础做简单介绍,然后通过向导实际的建立一个数据库应用程序,接着详细介绍常用的数据组件的使用方法,最后介绍了通过ODBC访问数据库的方法。2023年12月12日星期二DELPHI程序设计基础教程10.1 Delphi数据库编程基础数据库应用程序的构成数据库应用程序的构成 一个数据库应用程序通常由两部分组成:数据库访问链路和用户界面。Delphi采用开放式数据库体系结构,允许用户采用任何可获得的数据库引擎来创建数据库程序。Delphi使用可视化组件创建数据库应用程序,和创建其他应用程序一样,数据库组件同样具
3、有一定的属性,程序员可以在设计过程中设置组件的各种属性,也可以在程序运行过程中通过代码来改变数据库组件的各种属性。2023年12月12日星期二DELPHI程序设计基础教程10.1 Delphi数据库编程基础数据库引擎数据库引擎BDEBDE、ADOADO简介简介 1BDE数据库引擎 BDE数据库引擎(Borland Database Engine)是Borland公司推出的一种特有的用于访问数据库的机制,它可以让多个程序共享,为应用程序与数据库的连接提供了灵活性和通用性。BDE中封装了各种数据库驱动程序,可以访问本地数据库Paradox、dBase、FoxPro和Access,通过SQL Lin
4、ks驱动程序又可以访问远程数据库如InterBase、Oracle、Sql Server和DB2。BDE支持的面很广,因为它可以连接到ODBC,而ODBC本身就可以支持很多数据库,所以凡是ODBC可以连接的数据库,BDE都可以连接。BDE的基本构思是把应用程序与具体的数据库隔离开,提供一个统一的结构供用户使用,应用程序不再直接与具体的数据库打交道,而是向BDE提出操作数据库的申请,由BDE具体操作数据库,并把结果返回给应用程序。2023年12月12日星期二DELPHI程序设计基础教程10.1 Delphi数据库编程基础2ADO数据库引擎 ADO数据库引擎(ActiveX Data Object
5、)是微软推出的一套数据库访问规范。它使应用程序能够通过一种叫做OLE DB提供者(OLE DB Provider)的驱动程序访问和操作数据库,OLE DB是微软定制的通向不同的数据源的低级应用程序接口,OLE DB不仅包括微软的标准数据接口开放数据库连通性(ODBC)的结构化问题语言能力,还具有面向其他非SQL数据类型的通路。OLE DB也是一个基于COM的数据访问规则和API函数的集合,并经过了简化。实际上,ADO以ActiveX组件的形式封装了OLE DB,以提供一个更友好方便的使用方式。2023年12月12日星期二DELPHI程序设计基础教程10.2 数据源组件DataSource数据源
6、组件的属性数据源组件的属性 数据源(DataSource)组件是连接数据集组件(如Table、Query、StoredProc)与数据控制组件的桥梁,数据控制组件的DataSource属性指定数据源,而数据源的DataSet属性指定数据集。使用DataSource组件,必须设置它的DataSet属性,这是用来指明一个与当前数据源组件相联系的已知数据集组件的名字,其它属性可以根据需要设定。数据源组件位于工具栏的Data Access选项卡。(1)DataSet DataSet属性是用来指明一个与当前数据源组件相联系的已存在的数据集组件的名字。可以在设计阶段通过对象检视器来设置DataSet属性,
7、也可以在运行时通过代码修改该属性值。应用程序通过改变DataSet属性可以实现在同一个数据控制组件中显示和编辑不同数据集组件中的数据。(2)Enabled Enabled属性决定了与此数据源组件相连的数据控制组件是否显示数据,如果Enabled属性值为默认值True,数据控制组件将显示数据,如果Enabled属性值为False,则所有与此数据源组件相连的数据控制组件都将不显示任何数据。(3)State State属性是用来读取与此数据源组件相连的数据集组件的当前状态。数据集组件的当前状态表明了能对数据集所做的操作。2023年12月12日星期二DELPHI程序设计基础教程10.2 数据源组件Da
8、taSource数据源的方法数据源的方法 DataSource组件的方法使用的比较少,只需了解即可(1)Create 调用Create方法会创建一个DataSource组件(2)Edit Edit方法可使与数据源联系的数据集进入编辑状态,可以通过修改数据源的AutoEdit属性来实现该功能。2023年12月12日星期二DELPHI程序设计基础教程10.2 数据源组件DataSource数据源的常用事件数据源的常用事件(1)OnDataChange 当与该数据源组件相连的数据集的当前记录被编辑后,应用程序转移到其它字段或者转移到其它记录时触发该事件。由于该事件可被所有变化触发,所以能确保数据控制
9、组件反映当前数据集中的字段值。(2)OnStateChange 当与数据源连接的数据集状态发生改变时会触发该事件。(3)OnUpdateData 当前的记录被更新时触发该事件,该事件在数据集的Post方法之前被调用,一般用于在数据提交前进行附加的处理和确认操作。2023年12月12日星期二DELPHI程序设计基础教程10.3 数据集组件DataSet数据集的打开与关闭数据集的打开与关闭 在Delphi中,访问数据的基本单元是数据集对象,应用程序也是通过数据集组件来访问数据库。一个数据集对象就代表了数据库的一张表格,或者是访问数据库的一个查询或存储过程。数据集组件DataSet是一个抽象类,定义
10、了一些关于数据集的基本属性、方法和事件。在应用程序中实际使用的是它的子类Table、Query、StoredProc、ADOTable、ADOStoredProc等组件。Table、Query和StoredProc组件位于工具栏的BDE选项卡。Active属性用来说明数据库文件的打开状态。应用Active属性来决定及设定一个数据集组件与数据库数据之间的关系。当Active属性值为True时,表明数据集是打开的,数据集组件可以对数据库进行读写操作,否则表示数据集是关闭的,数据集组件不能从数据库读取数据,也不能向数据库中写数据。应用程序在改变其它影响数据库状态或在应用程序中显示数据的组件状态的属性
11、之前,必须先将Active属性设置为False。2023年12月12日星期二DELPHI程序设计基础教程10.2 数据源组件DataSource 对数据集的数据读、写都必须先打开数据集,打开数据集有两种方法:(1)将Active属性值设置为True;(2)调用数据集的Open方法。关闭数据集同样有两种方法:(1)将Active属性值设置为False;(2)调用数据集的Close方法。2023年12月12日星期二DELPHI程序设计基础教程10.3 数据集组件DataSet数据集状态数据集状态 State属性是用来读取与此数据源组件相连的数据集组件的当前状态。数据集组件的当前状态表明了能对数据集
12、所做的操作。当Enabled属性值为False或者没有指定DataSet属性的情况下,无论数据集组件的实际状态如何,State属性总是为dsInactive。其它情况下State属性值与数据集的当前状态一致。2023年12月12日星期二DELPHI程序设计基础教程10.3 数据集组件DataSet数据集的浏览数据集的浏览 (1)BOF和EOF属性 BOF(Beginning of File)属性值为一个布尔值,表明当前记录指针所处的位置是否为记录集的第一个记录。如果BOF为True,表明当前记录指针所处的位置确实是数据集的第一个记录。EOF(End of File)属性值为一个布尔值,表明当前
13、记录指针所处的位置是否为记录集的最后一个记录。如果EOF为True,表明当前记录指针所处的位置确实是数据集的最后一个记录。(2)First方法 在DataSet的派生类中,调用First方法将记录指针移至数据集的第一条记录处,并使之成为当前记录。同时将BOF属性值设置为True。(3)Last方法 Last方法与First方法非常相似,只不过Last方法是将记录指针移至数据集的最后一条记录处,并使之成为当前记录。它将EOF属性值设置为True。2023年12月12日星期二DELPHI程序设计基础教程10.3 数据集组件DataSet(4)MoveBy方法 MoveBy函数的基本格式如下:fun
14、ction MoveBy(Distance:Integer):Integer;调用MoveBy方法是将记录指针指向数据集中与当前记录相关的一条记录处,Distance是指需要移动的记录数目。距离是正值表明在数据集中朝前移动,负值表明是朝后移动。(5)Next方法 调用Next方法将记录指针置于数据集中的下一条记录,并使之成为当前记录。如果记录指针已处于数据集的最后一条记录,就将EOF属性值设置为True。(6)Prior方法 Prior方法与Next方法非常相似,Prior方法将记录指针置于数据集中的上一条记录,并使之成为当前记录;如果记录指针已处于数据集的第一条记录,就将BOF属性值设置为T
15、rue。2023年12月12日星期二DELPHI程序设计基础教程10.3 数据集组件DataSet对数据集进行的操作对数据集进行的操作(1)Append 调用Append方法不仅可以在数据集的末尾建立一个新的空记录,还可以将新的记录设置为当前记录。在调用Append方法后,应用程序允许用户向记录的字段中输入数据,并且能够通过调用Post方法将这些更改提交给数据库。(2)Cancel 调用Cancel方法可以用来取消对当前记录中一个或多个字段的修改。在这些更改还未提交给数据库时,Cancel方法使记录恢复到修改前的状态,并将数据集置于dsBrowse状态。(3)Delete 调用Delete方法
16、用来将当前记录从数据库中删除。如果该数据集处于激活状态,Delete方法将产生一个异常事件。(4)Edit 调用Edit方法用来编辑数据集中的当前记录。(5)Insert 调用Insert方法不仅可以在数据集中打开一个新的空记录,还可以将新的记录设置为当前记录。在调用Insert方法后,应用程序允许用户向记录的字段中输入数据,并且能够通过调用Post方法将这些更改提交给数据库。(6)Post 调用Post方法用来向数据库提交一个修改的记录。数据集中编辑修改数据库数据的方法如Edit、Insert或Append,以及浏览数据库中数据的方法如First、Last、Next和Prior都会自动的调用
17、Post方法。2023年12月12日星期二DELPHI程序设计基础教程10.3 数据集组件DataSet数据集的字段数据集的字段 字段组件代表了数据集中各个独立的字段,Delphi中定义了字段类Field及其相关的属性和方法,并提供了Field的派生对象。字段组件是非可视组件。一般来说,一个简单的字段组件用来表示数据表中的字段特征,如数据类型和字段大小。它也用于表示字段的显示特征如排列对齐方式、显示格式和编辑格式等。当在数据集的记录之间滚动时,字段组件将更新当前字段的值,并可以被调用相应的属性和方法来显示给用户。1常用属性 (1)FieldName属性 FieldName属性用于指定字段对象和
18、数据库中的哪个实际字段相对应,该属性值表示字段的实际名字。(2)ReadOnly属性 ReadOnly属性用来设置字段是否为只读,当属性值为True时字段只能读取不能修改;当ReadOnly属性值为False时,该字段可被读写。(3)Caculated属性 Caculated属性用于说明字段是否为计算字段,默认值为False。当属性值为True时表示该字段为计算字段,字段值需要通过计算得到。2023年12月12日星期二DELPHI程序设计基础教程10.3 数据集组件DataSet2字段的访问方式有两种方式可以访问当前记录的字段值:(1)使用属性Fieldsi访问当前记录,Fieldsi是按照字
19、段的顺序来访问的。每一个字段对象对应于数据库表中的一个字段,数据集的所有字段对象存在于属性Fields列表中,Fields列表中的字段对象就像数组元素一样拥有自己的索引号,可以用这个索引号来访问字段对象,索引号从0开始(表示表中最左边一列),依次递增。代码Query1.Fields0.DisplayLabel:=第一列;访问与Query1相连的数据库表中的第一个字段,并为该字段设置标题“第一列”。(2)使用方法FieldByName按照字段的名字来访问,如显示studentinfo表中Name属性值只需要使用代码Edit1.text:=Table1.FieldByName(Name).AsSt
20、ring;即可2023年12月12日星期二DELPHI程序设计基础教程10.4 BDE数据集组件 Table Table组件组件 Table组件和Query组件继承自数据集组件,位于工具栏的BDE选项卡,使用Table组件,主要是用来连接数据库的。它即可以在设计阶段通过对象检视器设定其属性值实现与数据库的连接,也可以在程序运行过程时通过代码动态指定连接的数据库。设定Table组件,首先要设置它的DatabaseName属性,即说明当前数据集的来源。通常该属性设置为BDE中的数据库别名,然后设置TableName属性,它是用来说明Table组件所对应的是数据库中的哪一张表格。这两个属性是Tabl
21、e组件中最基本、最重要的属性。如果要实现与数据库的高级连接,如对记录进行过滤等还要用到其它的属性和方法。2023年12月12日星期二DELPHI程序设计基础教程10.4 BDE数据集组件QueryQuery组件组件 Query是一个封装了SQL语句,专门用于对数据库中的数据进行查询的组件。Query组件可以一次访问数据库中的一个或多个表格,而Table组件一次只能访问一个表。Query组件访问的表格可以是在远程服务器的数据库中,也可以是当地的表格。Query组件和Table组件同属于数据集组件,继承了数据集组件的属性、方法和事件。其最大的不同在于Query支持SQL,可以利用SQL的灵活性,因
22、此它比Table更适合于高效的处理数据库的资源。Query和Table组件都是通过BDE数据库引擎来访问数据的,如果要访问SQL数据库,BDE会把Table命令转换为SQL语句,而Query相对简单,只要把整理过的SQL属性值传给数据库就可以了。2023年12月12日星期二DELPHI程序设计基础教程10.4 BDE数据集组件 DatabaseDatabase组件组件 数据库组件(Database)属于BDE组件,适用于以BDE方式与数据库进行连接。在数据库开发过程中,代表了应用程序所要访问的数据库,它的主要用途是控制数据库事务和进行缓存更新。如果在设计应用程序时没有手工加入一个数据库组件(大
23、部分情况都如此),程序会根据数据集组件的DatabaseName属性自动创建一个临时数据库组件,当应用程序和数据库断开连接后(比如程序运行结束),这个临时的数据库组件自动被清除。反之,如果在设计初期手工加入一个数据库组件,则这个组件的DatabaseName属性指定程序要访问的数据库,手工加入的数据库组件是永久组件,即使程序运行结束也不会被清除。2023年12月12日星期二DELPHI程序设计基础教程10.4 BDE数据集组件其他其他BDEBDE组件组件1StoredProc组件 StoredProc组件与Query组件、Table组件一样,属于数据集组件。StoredProc组件是用来完成数
24、据库服务器上的存储过程的。当一个应用程序必须在一个远程服务器的数据库中进行存储操作时,就会用到StoredProc组件。一个存储过程是一系列存储在服务器上的经过优化的SQL语句。存储过程执行与数据库相关的重复性任务并将结果传递给用户。值得注意的是并不是所有的数据库服务器都支持存储过程。使用存储过程可以提高数据库应用程序的效率,具体体现在:(1)充分利用服务器的处理能力和处理速度;(2)因为处理过程在服务器上进行,减少了网络传输的工作量;(3)存储在服务器上的存储过程是经过优化的,执行起来更快。2023年12月12日星期二DELPHI程序设计基础教程10.4 BDE数据集组件2数据库连接(Ses
25、sion)组件 数据库连接(Session)组件主要用于在多线程的数据库应用程序中管理数据库的连接,Session组件通常很少用,只有在对数据库进行高级操作时才用到,其作用主要体现在以下几个方面:(1)管理BDE别名。可以用会话期对象创建、删除、修改数据库的BDE别名;(2)在两层的数据库应用程序中控制数据库的连接;(3)在单层的数据库应用程序中对Paradox和dBase提供口令保护。即可以显示对话框让用户输入口令也可以在程序中提供口令(4)指定BDE网络控制文件PDOXUSERS.NET和存放私有文件的目录。Session组件不能被显式的创建,也无法观察到它。Delphi自动的为数据库应用
26、程序创建一个默认的Session组件,在应用程序运行时通过使用它的属性、方法和事件来控制这个默认的Session组件。2023年12月12日星期二DELPHI程序设计基础教程10.5 ADO组件 ADOConnectionADOConnection组件组件 ADOConnection组件是用来建立、维持一个与ADO数据源之间连接。用户在访问ADO数据源中的数据前,首先要建立与ADO数据源建立连接。虽然可以使用ADOTable或者ADOQuery组件与ADO数据源建立连接,但是这种连接只是为一个特定组件服务的。这时可以使用ADOConnection组件关联以共享连接。ADOConnection组
27、件相对于这些组件来说相当于一个数据库别名,如果后台数据库发生变化,只需改变ADOConnection组件的属性就可以了。2023年12月12日星期二DELPHI程序设计基础教程10.5 ADO组件ADODataSetADODataSet组件组件 ADODataSet组件是最常用的ADO数据集组件之一,它具有从一个或多个ADO数据表中找到结果数据集的功能。1ADODataSet组件的常见属性(1)ConnectionString属性 ConnectionString属性用于设置建立连接的字符串,其设置方法和ADOConnection组件完全一致,请参见10.5.1节。如果不设置Connectio
28、nString属性,可以设置Connection属性关联ADOConnection组件。(2)CommandText属性 CommandText属性用于指定ADODataSet组件的数据集,可以指定一个数据表格或者Select SQL语句。这里只能为Select语句,ADODataSet组件不能使用数据操纵语言(如Insert、Update、Delete),因为数据操纵语言不返回数据结果。如果要使用数据操纵语言可以使用ADOQuery组件。2023年12月12日星期二DELPHI程序设计基础教程10.5 ADO组件 ADOTable ADOTable、ADOQueryADOQuery和和ADO
29、StoredProcADOStoredProc组件组件 在Delphi的ADO组件中,除了提供数据集组件ADODataSet外,还提供了ADOTable组件、ADOQuery组件和ADOStoredProc组件,这四个组件的功能几乎是一样的,都通过ADO的RecordSet对象来执行内部的工作。封装ADOTable组件、ADOQuery组件和ADOStoredProc组件的主要目的是让原来熟悉BDE的开发人员能够快速的使用ADO组件。不同点主要在于:(1)ADOTable、ADOQuery和ADOStoredProc组件通过ADO与数据库相连,而Table、Query和StoredProc组件
30、通过BDE连接数据库;(2)ADOTable、ADOQuery和ADOStoredProc组件除了具有与Table、Query和StoredProc组件相同的、用于访问数据库数据的属性和方法外,还有用于建立组件与ADO数据库之间连接的属性和方法,如Connection、ConnectionString、CommandText、ConnectionType等。2023年12月12日星期二DELPHI程序设计基础教程10.6 数据控制组件 DBGrid DBGrid组件组件 在前面的讲解中一直在使用DBGrid组件,DBGrid组件以表格形式显示数据集中的数据,并像一般电子表格一样,允许用户操作表
31、格中的数据,对其进行编辑。在窗体中放置一个DBGrid组件来显示和编辑一个数据集中的记录,应用程序可以通过该组件来插入、修改和删除数据集中的数据,或者将ReadOnly设置为True,仅仅供用户浏览。2023年12月12日星期二DELPHI程序设计基础教程10.6 数据控制组件 DBNavigatorDBNavigator组件组件 DBNavigator组件是用来在数据集中浏览和编辑数据的,它由一组控制按钮组成。使用该按钮可以向前或向后移动记录指针,可以使用该组件对单条记录进行编辑,还可以用它来插入、删除记录以及取消操作。DBNavigator组件一般与其它数据控制组件一起使用。当用户使用DB
32、Navigator组件中的按钮时,与此DBNavigator组件相连的数据集会发生相应的变化。例如当用户选择了其中的Insert按钮,数据集中将被插入一条空的新记录。而当用户选择了移动记录的按钮,相当于调用了数据集中First、Prior、Next、Last方法,数据集中的记录指针也会随着发生移动。2023年12月12日星期二DELPHI程序设计基础教程10.6 数据控制组件其他其他Data ControlData Control组件组件1DBText组件 DBText组件是用来显示数据集里当前记录中一个特定字段的值的数据控制组件。用DBText组件显示的字段值是具有只读属性的,即用户不能通过
33、这个组件来修改数据,类似于Label组件,但是DBText组件与Label组件不同的地方在于它显示的是当前记录中特定字段的值,随着记录指针的移动,其显示的内容也不断变化。如果用户还需要修改数据,则需要使用DBEdit组件。DBText组件的重要属性:(1)DataSource属性 DataSource属性与DBGrid和DBNavigator一样,设置一个数据源组件名称,通过此数据源组件与数据集组件相联系,从而读取数据集中的数据。(2)DataField属性 DataField属性是用来确定DBText组件显示的是当前记录中哪个特定字段的值。在完成DBText组件与特定数据集的联系后,对象检视
34、器中的DataField属性会自动产生一个下拉列表,包含了当前打开数据集的所有字段。2023年12月12日星期二DELPHI程序设计基础教程10.6 数据控制组件2DBEdit组件 DBEdit组件是用来显示和编辑数据集里当前记录中一个特定字段的值的数据控制组件。DBText组件显示的字段值是只读的,而使用DBEdit组件允许用户编辑修改数据。DBEdit组件显示的是当前记录中特定字段的值,所以随着记录指针的移动,其显示的内容也不断变化。但与DBGrid组件不同,它一次只能显示和编辑当前记录中特定的一个字段值。DBEdit组件的重要属性:(1)DataSource属性 DataSource属性
35、与DBGrid和DBNavigator一样,设置一个数据源组件名称,通过此数据源组件与数据集组件相联系,从而读取数据集中的数据。(2)DataField属性 DataField属性是用来确定DBText组件显示的是当前记录中哪个特定字段的值。在完成DBText组件与特定数据集的联系后,对象检视器中的DataField属性会自动产生一个下拉列表,包含了当前打开数据集的所有字段。2023年12月12日星期二DELPHI程序设计基础教程本章小结t 本章介绍了Delphi数据库的编程基础,然后通过向导实际的建立一个简单的数据库应用程序,接着详细介绍常用的数据访问组件DataSet、DataSource和数据控制组件DBGrid、DBNavigator的使用方法,最后介绍了通过ODBC访问数据库的方法。掌握这些基本内容开发一个数据库应用程序就会变得轻而易举