Delphi 7.0数据开发实例教程

IT商界

  Delphi一直以其强大易用的特点得到程序员的青睐。Delphi 7.0除保留了以前版本的强大功能之外,更在数据库程序开发方面提供了强有力的支持,使程序员完全可轻松开发出复杂且功能强大的数据库应用程序。

  一、Delphi数据库访问方法详解

  在进行Delphi 7.0数据库开发以前,首先让我们来回顾一下Delphi中提供的数据库访问方法。

  1.BDE方法

  BDE(Borland Database Engine,Borland数据库引擎)方法提供了存取各种文件型和客户/服务器型数据库的驱动程序。该方法可直接访问Paradox和DBase等数据库或通过ODBC(Open DataBase connectivity,开放数库互连)来访问Access和FoxPro等数据库,还可通过内嵌方式访问SQL Server、Oracle和DB2等大型数据库。其美中不足之处在于BDE方法占用的磁盘空间大,且不适合开发“绿色”软件,加之Borland对该方法已几乎不进行开发了,因此建议尽量不使用。

  2.ADO方法

  ADO(ActiveX Data Objects,ActiveX数据对象)方法是微软提供的一种数据库访问技术。通过ADO技术可方便地访问各种类型的数据库,尤其对于OLEDB类型的数据库,ADO更是访问数据库的标准接口。Delphi通过ADO技术可让开发者快速访问关系或非关系型数据库,但使用时需安装ADO的数据库引擎,因而较为麻烦。

  3.MIDAS方法

  MIDAS(Multitier Distributed Application Services Suite,多层分布式应用程序服务套件)方法是Delphi用于开发多层应用系统的中间透明引擎。通过MIDAS,开发者可使用相同的组件来存取不同的后台应用程序服务器。这些后台应用服务器程序包括COM+/DCOM应用程序服务器、MTS(Microsoft Transaction Server,微软事务处理服务器)中间件或CORBA应用程序服务器。MIDAS方法实现了真正意义上的客户端程序与后台数据库的分离,但MIDAS的灵活性很差,与数据感应控件关联过于密切,限制了程序员的创造性。

  4.dbExpress方法

  Delphi 7.0提供了新一代的跨平台数据访问引擎dbExpress方法,它由一组新控件、技术和驱动程序组成,并通过这些组成部分和各种数据源连接。如配合不同的数据库动态链接库文件,还可处理后台数据库的数据。由于dbExpress可直接在Windows和Linux平台上使用,因此也是Delphi和Kylix的核心数据访问方式。

  综上所述,虽然Delphi的各个版本提供了多种数据库的连接和访问方法,但在同一个应用系统中,开发者几乎不可能同时选用多种连接方法,因而选择适用的连接方法是一个必须在开发前仔细考虑的问题。

  合理选择数据库的连接和访问方法首先需要针对不同的应用环境进行选择:一般C/S(客户/服务器)类型的应用程序适合使用ADO方法,而瘦客户端的分布式系统则适用MIDAS方法,对于跨平台的应用程序,非dbExpress方法莫属。

  二、深入数据库编程控件

  在Delphi 7.0中,按数据库连接方法的不同,控件可分为BDE控件组、ADO控件组、Data Controls控件组和dbExpress控件组。

  (一)BDE控件组

  BDE控件组共包含了8个控件,如图1所示:

  1.TTable控件

  TTable控件是Delphi数据库编程中经常使用的控件之一,也是数据库应用程序访问数据库时必须使用的数据集控件。

  (1)TableName属性:该属性用于设置当前TTable控件所连接的实际数据库表。

  (2)IndexName属性:该属性用于设置存放于建立数据库表时为数据库表定义的辅助索引名,是一个辅助索引名列表。

  (3)IndexFieldNames属性:该属性用于设置数据库表索引排序的字段名,多个字段名之间用分号隔开,在属性中指定的字段必须存在于相应的数据库表中,否则会出错。

  (4)IndexFields属性:该属性值代表数据库表中字段名列表,包含和TTable控件相连接的数据库表中全部索引字段名。

  (5)IndexFieldsCount属性:该属性返回数据表中索引字段数。

  (6)Exclusive属性:该属性为逻辑型属性,用于设置是否通过共享方式来打开数据库表,如为True,则打开数据库表时,其他用户无法访问,反之将通过共享方式打开数据库表。

  (7)ReadOnly属性:该属性为逻辑型属性,用于设置用户是否可对表中的数据进行读写。如为True,则仅可读取数据,反之可读写数据。

  (8)CanModify属性:该属性为只读属性,用于返回用户对数据库表拥有的实际特权,并和ReadOnly属性密切关联。

  (9)SetRangeStart、SetRangeEnd方法:SetRangeStart方法用于指定检索范围的起始记录,调用该方法后,可为起始记录的一个或多个字段指定相应的字段值。SetRangeEnd方法用于指定检索范围的结束记录,调用该方法后,可为结束记录的一个或多个字段指定相应的字段值。

  (10)SetRange方法:该方法包含SetRangeStart和SetRangeEnd方法的功能,可同时指定检索范围的起始和结束记录。

  (11)ApplyRange方法:该方法按SetRangeStart、SetRangeEnd或SetRange方法说明的检索范围起始和结束记录来设置检索范围,调用该方法后,应用程序仅可对检索范围内的记录进行操作。

  (12)CancelRange方法:该方法作用和ApplyRange方法相反,即取消为表设置的检索范围,在调用CancelRange方法后,应用程序即可对表中全部记录进行操作。

  2.TQuery控件

  TQuery控件是一个数据集控件,与TTable控件有很多相同的属性、事件和方法,该控件实现了对SQL语言的支持,SQL语句通过TQuery控件传递至需访问的数据库引擎,由对应的数据库引擎执行SQL语句来实现对数据库的操作。

  (1)SQL属性:该属性为TString对象,可设置SQL语句。在设计界面中单击“SQL”属性“[Tstrings]”后的按钮,即可打开用于输入SQL语句的“String list editor”对话框,输入完毕并关闭后将控件的“Active”属性设置为True即可执行。用户还可单击“String list editor”对话框中的“Code Editor…”按钮在代码窗口中编写SQL语句。

  (2)Params属性:该属性用于为SQL语句中的参数赋值。在SQL属性中,SQL语句可包含参数,而含有参数的SQL语句称为动态SQL语句。单击“Params”属性后的按钮,可打开参数编辑对话框,所有的参数均列此处。用鼠标单击选择参数,在左边的属性窗口中可为此参数设置类型、数值等。此外,Params参数还可在程序中设置。

  (3)RequestLive属性:该属性用于设置查询结果是否可编辑,默认无法编辑查询的结果数据。如为True,则可在一些限制条件下编辑查询结果。

  (4)ExecSQL方法和Open方法:这两个方法均用于执行SQL代码,即执行SQL属性输入的SQL语句。

  二者不同之处在于:Open方法仅用于执行SQL语言的查询语句(Select命令)并返回查询结果集,而ExecSQL方法除可执行Select语句外,还可执行其他SQL语句(如Update、Insert、Delete等),且不返回执行的结果。

  (5)Prepare、UnPrepare方法:Prepare方法调用后会将带有参数的SQL语句传送至其对应的数据库引擎,并对SQL语句进行语法分析和优化。调用Prepare方法将提高SQL语句的执行性能,尤其在需反复执行同一条动态SQL语句的场合,其优越性更为明显。

  3.TDataBase控件

  TDataBase控件一般用于程序和数据库之间的永久连接、数据库服务器需用户登录、指定别名等需求,一般情况建议不使用该控件。

  (1)AliasName属性:该属性用于指定需连接的数据库别名,且别名需已在BDE配置中存在。

  (2)DataBaseName属性:该属性用于指定需连接的数据库名称,当数据库名称和BDE中某个数据库别名相同时,AliasName和DriverName属性均不需设置,也可通过Database Editor设置。不过两者仅可取其一。

  (3)LoginPrompt属性:该属性为逻辑型变量,用于控制数据库在连接时是否弹出登录窗口。

  (4)KeepConnection属性:该属性为逻辑型变量,当设置为True时,即使数据集未打开也可保持连接,主要用于服务器型数据库,并可降低网络数据传输量,以提高程序执行效率和避免每次连接的登录操作。

  4.TDataSet控件

  数据集控件TDataSet派生出TTable控件和TQuery控件两个重要控件,且具有许多共同的属性、方法和事件,因此习惯将这两个控件统称为数据集控件。

  (1)数据集的打开和关闭:数据集控件TDataSet虽然直接和数据库表进行连接,但应用程序在通过数据集控件访问数据时,必须将被访问的数据库表调入内存,同时还需将与TDataSet控件相连接的数据库表调入内存。该操作对数据集控件而言称为“打开”,反之称为“关闭”。

  Delphi通过设置Active属性为True或调用Open方法来打开和数据集相连的数据库表,并通过设置Active属性为False或调用Close方法来关闭和数据集相连的数据库表。

  (2)数据集的导航与维护:数据集中存放着数据库表中的多条数据记录,在很多需求情况下,经常需将记录指针定位于特定记录,又称为数据库表导航。

  数据集中的数据维护主要包括数据记录的修改、插入和删除。Delphi为数据集控件提供了相应的方法用于其中的数据导航与维护,如下表所示:

方法

功能

First 移动记录指针到表中的第一条记录
Next 移动记录指针到表中的下一条记录
Prior 移动记录指针到表中的前一条记录
Last 移动记录指针到表中的最后一条记录
Edit 将数据集置为编辑状态
Append 保存所有被修改的记录,将记录指针移到表中的最后一条记录,且将数据集置为插入状态
Insert 投寄所有被修改的记录将数据集置为插入状态
Post 将插入的新记录和修改的记录写回磁盘上的数据库表,即保存,当保存成功时数据集回到浏览状态,若保存不成功数据集仍然保持原有状态
Cancel 取消当前的操作且将数据集置为浏览状态
Delete 删除当前记录指针所在的记录且将数据集置为浏览状态
GetBookMark 返回一个TBookMark类型的变量,该变量包含着指向当前记录的指针
GotoMark 用于快速地将记录指针定位到具有书签的记录处
FreeBookmark 该方法与GetBookMark方法操作相反,它释放书签标志

  (3)数据集控件和数据浏览控件的连接:数据集控件TDataSet通过一些方法来控制数据集控件和与其相连的数据浏览控件之间的连接,及控制数据浏览控件的显示,如下表所示:

 

方法

功能

DisbaleControls 在用户修改和更新以及遍历数据库表中的记录时,调用该方法以切断TDataSet控件与数据浏览控件的连接,使数据浏览控件暂时失效,否则,在对TDataSet控件的每次修改之后,窗体中所有与它们相连的数据浏览控件都要更新其显示内容。当遍历表中的记录时记录指针每移动一下,窗体中的数据浏览控件也随之更新其中的显示内容
EnableControls 该方法的作用与DisbaleControls方法的作用相反,调用该方法,使TDataSet控件恢复与数据浏览控件的连接,使暂时失效的数据浏览控件恢复到正常显示的状态
Refresh 该方法用于刷新数据浏览控件中的显示。在调用该方法时,必须要确保TTable或TQuery控件是打开的。当数据集中的记录被修改之后,调用该方法,数据浏览控件中显示的信息也随之改变

  (4)数据集控件的事件:数据集控件TDataSet提供了很多事件,通过为这些事件编写相应的程序代码即可实现有效性验证、计算可计算字段值、确认对数据库表等多种操作,如下表所示:

 

 

事件

描述

BeforeOpen 在数据集控件被打开之前被触发
BeforeClose 在数据集控件被关闭之前被触发
BeforeInsert 在数据集控件进入插入状态之前被触发
BeforeEdit 在数据集控件被编辑之前被触发
BeforePost 在数据集控件投寄被修改的记录之前被触发
BeforeCancel 在数据集控件取消前一步操作之前被触发
BeforeDelete 在数据集控件删除当前记录之前被触发
Afteropen 在数据集控件被打开之后被触发
Afterclose 在数据集控件被关闭之后被触发
AfterInsert 在数据集控件进入插入状态之后被触发
AfterEdit 在数据集控件被编辑之后被触发
AfterPost 在数据集控件投寄被修改的记录之后被触发
AfterCancel 在数据集控件取消前一步操作之后被触发
AfterDelete 在数据集控件删除当前记录之后被触发
OnNewRecord 当建立一条新记录时被触发
OnCalcFields 当为表中的计算字段计算字段值时被触发

  (二)ADO控件组

  ADO控件组共包含了7个控件,如图2所示:

  1.TADOConnection控件

  该控件类似于前述的TDataBase控件,实现“共享桥梁”的作用,对于ADO控件组中的其他5个控件而言,该控件相当于数据库别名。

  (1)ConnectionString属性:该属性的值是一个连接字符串,可使用Data Link File(数据连接文件)(.udl)或手工建立该连接字符串,一般格式如下所述:

  Provider=ProviderName;DSN=DSNName;

  DRIVER=driver; SERVER=server;

  DATABASE=database;

  UID=user; PWD=password

  其中各参数的含义如下所述:

  Provider:数据提供者,默认为MSDASQL,为微软OLEDB,通常省略。

  DSN:打开的数据库对应的OBDC系统数据源(DSN),为可选参数。

  DRIVER:打开的数据库所用的驱动程序名称,如Access对应Microsoft Access Driver(*.mdb),为可选参数。

  SERVER:打开的数据库所在的服务器名称或IP地址,对于本机可使用(localhost或127.0.0.1),为可选参数。

  DATABASE:打开的数据库名称,为可选参数。

  UID:用户名称,用于访问数据库,为可选参数。

  PWD:用户密码,用于访问数据库,为可选参数。

  (2)LoginPrompt属性:该属性为逻辑型变量,用于控制数据库连接时是否弹出登录窗口。

  2.TADOCommand控件

  该控件并非数据集控件,因此无法和DataSource控件相连接,但其提供了CommandType与CommandText两个重要属性,设置属性后即可通过ExecSQL方法执行SQL语句。该控件并不常用,且大部分功能均可通过其他控件实现,一般不建议使用。

  3.ADODataSet控件

  该控件可直接和数据表联接,并可执行SQL语句和存储过程,几乎集TADOTable、TADOQuery、TADOStoreProc三者功能于一身。

  使用该控件时,首先需设置其Connection属性为TADOConnection控件,如无TADOConnection控件则直接设置ConnectionString属性。

  随后设置两个相互关联的重要属性CommandType和CommandText,其中CommandType属性用于设置采用何种方式连接,且设置CommandType属性后,CommandText属性会自动关联设置。

  4.TADOTable控件

  TADOTable控件和前述的TTable控件的功能和作用类似。

  (1)Connection属性:该属性当使用了TADOConnection控件时,直接设置Connection属性指向TADOConnection控件即可。

  (2)TableName属性:该属性用于设置当前TADOTable控件所连接的实际数据库表。

  (3)IndexName属性:该属性用于存放在建立数据库表时为数据库表定义的所有辅助索引名,是一个辅助索引名列表。

  (4)IndexFieldNames属性:该属性用于设置数据库表索引排序的字段名,多个字段名之间用分号隔开。

  (5)ReadOnly属性:该属性为逻辑型属性,设置用户是否可对表中的数据进行读写。

  5.TADOQuery控件

  该控件的使用方法和前述的TQuery控件类似。

  (1)SQL属性:该属性为TString对象,可输入SQL语句。

  (2)Parameters属性:该属性用于为SQL语句中的参数赋值,需注意,在程序中为参数赋值时,该控件和TQuery控件有语法的区别。

  (3)ExecSQL方法和Open方法:这两个方法均用于执行SQL代码,且区别和前述的TQuery控件相应方法相同。

  6.TADOStoredProc控件

  该控件用于执行存储过程,由于涉及存储过程到的编写知识,因此在此不做讲述。

  (三)Data Controls控件组

  Data Controls控件组是一组数据库感应控件组,共包含了15个控件,如图3所示:

  1.TDBGrid控件

  TDBGrid控件用于显示和编辑数据库表中数据,可通过网格形式显示数据库表中全部记录的所有字段信息。TDBGrid控件在程序设计中经常使用,可灵活用于显示和编辑数据库表中的记录信息。

  (1)Options属性:该属性是TDBGrid控件的一个扩展属性,在程序设计阶段设置Options属性可控制TDBGrid控件的显示特性和对事件的响应特性。

  (2)DragMode属性:该属性有两个可选的常量属性值。当设置为dmManual时,在应用程序运行过程中用户可用鼠标拖放网格中的各列并改变各列在网格中的显示顺序和位置。当用鼠标拖放网格中的一列、改变其在网格中的位置时,仅改变了该列在数据集中的位置,并未改变对应的数据库表中的位置。当设置为dmAutomatic时,那么用户无法用鼠标拖放网格中的各列并改变其在网格中的位置。

  (3)DefalultDrawing属性:该属性为逻辑型属性,用于控制网格中各网格单元的绘制方式。缺省情况该属性的值为True,即是Delphi使用网格本身缺省的方法绘制网格中各网格单元,并填充各网格单元中的内容。

  (4)TDBGrid的常用事件:TDBGrid的常用事件如下表所示:

 

事件

说明

OnColEntor事件 当用户进入网格各列时触发该事件
OnColExit事件 当用户离开网格各列时触发该事件
OnDblClick事件 当用户在网格中双击鼠标左键时触发该事件
OnDragDrop事件 当用户在网格中用鼠标进行拖放操作时触发该事件
OnDragOver事件 当用户在网格中用鼠标拖动网格时触发该事件
OnDrawDataCell事件 用于定制绘制网格中各网格单元,当向网格中填充数据时触发该事件
OnEndDrag事件 当用户停止拖动网格时触发该事件
OnEnter事件 当网格获得焦点时触发该事件
OnExit事件 当网格失去焦点时触发该事件
OnKeyDown事件 当用户在网格中按下任何键或组合键时触发该事件
OnKeyPress事件 当用户在网格中按了任何一个数字键或字母键时触发该事件
OnKeyUp事件 当用户在网格中释放任何被按下的键时触发该事件

  2.TDBNavigator控件

  TDBNavigator控件主要用于在数据集中进行记录导航和为用户操纵数据集中的记录提供了一组简单的控制按钮。用户单击其中的按钮可实现诸如前后移动记录指针、插入记录、修改记录、提交修改、取消修改、删除记录及刷新记录等功能。

  (1)TDBNavigator控件各按钮功能:各按钮功能如下表所示:

 

按钮

说明

First按钮 将当前记录指针移到数据库表中第一条记录处
Prior按钮 将记录指针移到当前记录的前一条记录处
Next按钮 将记录指针移到当前记录的后一条记录处
Last按钮 将当前记录指针移到数据库表中最后一条记录处
Insert按钮 调用数据集控件的Insert方法,在当前记录的前面插入一条新记录,并将数据集控件置为插入状态
Delete按钮 删除当前记录,如TDBNavigator控件的ConfirmDelete属性设置为true时,会弹出删除确认对话框
Edit按钮 将数据集控件置为编辑状态,以便用户修改当前的记录
Post按钮 投寄对当前记录的修改
Cancel按钮 取消对当前记录的修改,并将数据集控件置为浏览状态
Refresh按钮 清除数据浏览控件的显示缓冲区,并用与其相连的数据集控件中的记录刷新显示缓冲区

  (2)VisibleButtons属性:该属性中包含多个可选的扩展子属性,主要用于选择TDBNavigator控件中各个控制按钮的是否显示。由于实际应用中,有时不需显示全部的控制按钮,因此可在VisibleButtons属性中设置按钮的显示情况。

  (3)ShowHint属性:该属性为逻辑型属性,用于控制是否显示TDBNavigator控件中各按钮的动态提示信息。当值为True时,用户将鼠标停留在TDBNavigator控件中某一个控制按钮1秒钟后,Delphi便会自动显示有关该控制按钮的提示信息。

  (4)Hints属性:缺省情况,TDBNavigator控件中的各控制按钮均有相应的动态提示信息,用户可按需通过设置Hints属性,为各控制按钮设置其他的动态提示信息。

  3.TDBText控件

  TDBText控件是一个只读的数据浏览控件,用于显示数据库表中记录的指定字段值。由于TDBText控件显示表中当前记录的指定字段值,因而显示的内容也是动态的,在其中显示的内容随记录指针的移动而变化。

  4.TDBEdit控件

  TDBEdit控件用于显示编辑数据库表中当前记录的各个字段值,在应用程序中常用TDBEdit控件来对应数据表的字段,并通过设置DataSource和DataField属性为TDBEdit控件指定表中相应的字段。

  如需通过TDBEdit控件编辑数据库表中的字段值,还需设置ReadOnly属性为False,并设置相连数据源控件的AutoEdit属性为True及确保数据集控件TTable或TQuery控件处于编辑状态,即设置CanModify属性为True。

  5.TDBMemo控件

  TDBMemo控件主要用于显示和编辑数据库表中的大二进制(BLOB)类型的字段值,可显示多行文本,也允许用户输入并编辑多行文本信息,是Delphi中用于显示和编辑数据库表中的大二进制类型文本字段的唯一数据浏览控件。

  (1)ReadOnly属性:该属性为逻辑型属性,如为True时,仅可在控件中显示BLOB型文本信息,即很多数据库表中的备注型字段。如为False时,在控件中不仅可显示BLOB文本信息且还允许编辑其中的文本信息。

  (2)MaxLength属性:该属性为整数型属性,用于设置可输入的字符数,如设置为0,则输入字符个数无限。

  (3)SCrollBar属性:该属性用于设置控件是否显示滚动条。

  (4)WordWrap属性:该属性设置控件中输入文本信息时是否自动换行。

  (5)Alignment属性:该属性文本信息在TDBMemo控件中的对齐方式,有taLeftJustify(左对齐)、taCenter(居中)和taRightJustify(右对齐)三种可选值。

  (6)AutoDisplay属性:由于TDBMemo控件包含大量文本信息,如需显示其中信息需花费很长时间,尤其等用户移动记录指针时,均需更新控件显示的信息。因此Delphi为TDBMemo控件设置了AutoDisplay属性,用于控制是否自动显示表中的备注型字段。如为False时,TDBMemo控件中仅显示对应表中的字段名而不显示字段中的文本信息,如需浏览字段中的文本信息,只需双击TDBMemo控件内部即可。

  6.TDBImage控件

  TDBImage控件用于显示和编辑数据库表中的BLOB类型的位图图像字段的。缺省情况TDBImage控件允许用户对位图图像进行编辑。TDBImage控件提供了AutoDisplay属性,该属性的控制和作用和前述的TDBMemo 控件AutoDisplay属性相同。

  7.TDBComboBox控件

  TDBComboBox控件中包含了TDBEdit控件的全部功能,不同之处在于运行过程中TDBComboBox控件还提供了下拉式列表框来显示可供选择的项。

  (1)Items属性:该属性包含控件在运行过程中下拉式列表框中的可选项,并可在设计阶段设置。

  (2)Style属性:该属性用于控制控件列表框的显示格式,可包含一个下拉式列表框和一个编辑框、仅只显示一个列表框、显示一个下拉式列表框和一个只读编辑框、字符串选项和其他类型选项并存等显示风格。

  (3)DropDownCount属性:该属性用于设置列表框中显示可选项的最大数,当可选项数目大于该属性值时,用户可用滚动条浏览全部可选项,当可选项数小于该属性值时,列表框会自动调整其大小以显示全部可选项。

  (4)ItemHeight属性:该属性在当控件的Style属性被设置为CSOwnerDrawFixed时,可设置列表框中每个可选项的高度。

  (5)Sorted属性:该属性为逻辑型属性,用于设置表框中的可选项是否按字母顺序排序。

  8.TDBListBox控件

  TDBListBox控件的基本功能和TDBComboBox控件几乎相同,不同之处在于TDBListBox控件仅有一个列表框,在列表框中显示一组供用户选择的可选项,用户无法上输入如何列表框中不存在的字段值。

  9.TDataSource控件

  TDataSource控件是连接数据集控件和数据浏览控件的桥梁。TDataSource控件本身很简单,属性、事件和方法均较少。在使用该控件时无需太多的设置,主要为数据浏览控件服务,如在应用程序中未使用数据浏览控件,那么也不必为应用程序添加TDataSource控件。

  (1)DataSet属性:该属性用于设置TDataSource控件获取数据的数据集名,可使用TTable、TADOTable或TSQLTable控件名,也可为TQuery、TADOQuery或TSQLTQuery控件名,甚至还可指定其他窗体内的数据集名称。

  (2)Enable属性:该属性为逻辑型变量,可切断TDataSource控件和相连数据集控件的连接,当为False时,TDataSource控件和数据集控件的连接被切断,且所有与TDataSource控件相连的数据浏览控件中将变为空白,不显示任何数据信息。不过实现上述功能,一般不使用Enabled属性,而调用数据集控件的DisableControls方法和EnableControls 方法,可方便地控制与数据集控件相连的所有TDataSource控件及与TDataSource控件相连的数据浏览控件。

  (3)AutoEdit属性:该属性为逻辑型变量,用于设置是否将与TDataSource控件相连的数据集置于编辑状态。当值为True时,应用程序运行后和TDataSource相连的数据集控件将自动地设置为编辑状态,当用户在数据浏览控件中输入新值时,数据集控件中的记录也随之改变。

  (4)OnDataChange事件:该事件在与TDataSource相连的数据集中记录指针位置发生改变时触发,即当程序调用数据集控件的Next、Previous、Insert、Append等方法导致记录指针的位置发生改变时,触发该事件。该事件一般用于保持多个控件间的同步。

  (5)OnUpdataData事件:该事件当数据集控件中当前记录将被修改时触发。如在程序调用post方法后但在修改后的数据记录真正被写回磁盘数据库文件前触发该事件。

  (6)OnStateChange事件:该事件在与TDataSource控件相连的数据集控件状态发生变化时触发。当数据集的状态发生变化时,使用该事件进行有关的处理是很有用的。

  (四)dbExpress控件组

  dbExpress控件组是Delphi 7.0新增的数据库访问控件组,共包含了7个控件,如图4所示:

  1.TSQLConnection控件

  TSQLConnection控件用于程序和数据库的永久连接、数据库服务器需用户登录、指定别名等需求,一般情况可不使用该控件。

  在TSQLConnection的控件编辑器里,可查看Delphi 7.0所支持的所有数据库,如InterBase 6.5/6.x、DB2 7.2、Oracle 9i、MySQL 3.23.49、MS SQL Server 2000、Informaix SE等只需为连接设置相应值即可。

  (1)ConnectionName属性:该属性用于选择数据库驱动。

  (2)LoginPrompt属性:该属性为逻辑型变量,用于设置数据库连接时是否弹出登录窗口。

  (3)KeepConnection属性:该属性为逻辑型变量,如为True时,即使数据集未打开也可保持连接。

  2.TSQLDataSet控件

  TSQLDataSet控件可直接和数据表联接,也可执行SQL语句和存储过程,几乎集TSQLTable、TSQLQuery和TSQLStoreProc三者功能于一身。该控件的使用方法和前述的TADODataSet控件非常类似,不做赘述。

  3.TSQLQuery控件

  该控件使用方法和前述的TQuery控件及TADOQuery类似。

  (1)SQLConnection属性:该属性用于设置控件连接的TSQLConnection控件。

  (2)SQL属性:该属性用于设置控件需执行的SQL语句。

  (3)Params属性:该属性用于为SQL语句中的参数赋值。

  (4)ExecSQL、Open方法:这两个方法用于执行SQL代码,不同之处和前述TQuery控件的ExecSQL方法和Open方法相同。

  4.TSQLTable控件

  TSQLTable控件与TTable控件及TADOTable非常类似。

  (1)SQLConnection属性:该属性用于设置指向的TSQLConnection控件。

  (2)TableName属性:该属性用于设置TSQLTable控件所连接的实际数据库表。

  (3)IndexName属性:该属性用于存放在建立数据库表时为数据库表定义的所有辅助索引名,是一个辅助索引名列表。

  (4)IndexFieldNames属性:该属性用于设置用于数据库表索引排序的字段名。

  5.TSQLStoredProc控件

  该控件用于执行存储过程。

  (1)SQLConnection属性:该属性用于设置指向的TSQLConnection控件。

  (2)StoredProcName属性:该属性用于设置所连接的存储过程名称。

  (3)Params属性:该属性用于为存储过程的参数赋值。

  6.TSimpleDataSet控件

  TSimpleDataSet控件的功能等同于dbExpress控件组中TSQLConnection和TSQLDataSet加上Data Access控件组中TdataSetProvider和TclientDataSet控件功能的集合。

  (1)Connection属性:该属性等同于TSQLConnection控件的Connection属性。

  (2)DataSet属性:该属性等同于TSQLDataSet控件的DataSet属性。

  (3)IndexName属性:该属性存放在建立数据库表时为数据库表定义的所有辅助索引名。

  (4)IndexFieldNames属性:该属性用于设置数据库表索引排序的字段名,多个字段名之间用分号隔开。

  (5)Params属性:该属性用于为参数赋值。

  在开始实例介绍之前,我们有必要先了解一下Delphi 7.0数据库程序的开发步骤,针对不同的数据库连接方式,Delphi 7.0的数据库程序有不同的开发步骤。限于篇幅,本文就不做具体介绍,读者可以根据下面的实例自行归纳。

  三、数据库开发实例──C/S模式

  众所周知,Delphi的可视化功能相当强大,因此编制一个简单的数据查看、维护程序是非常方便的,几乎不需编制任何代码或仅用简单代码即可实现。下文中我们将通过C/S模式和DataSnap模式实现的简单客户管理模块来帮助读者巩固前述的数据库编程知识。

  首先让我们来看看C/S模式。C/S,即Client/Server模式,指在局域网内的各个客户端程序直接访问数据库。本文介绍的实例是一个客户关系管理程序。

  1.设计数据库

  首先建立一个Access数据表。名称为“company”,用于存放简要的客户资源信息,数据表的各个字段如图5所示。

  2.连接数据库

  在Delphi中新建工程,然后在ADO控件组中添加TADOConnection控件,命名为“ADOConnection”并双击该控件。

  在打开的连接字符串设置对话框中单击“Build”按钮,在打开的对话框“Provider”选项卡的数据库连接列表中选择“Microsoft Jet 4.0 OLE DB Provider”选项,用于连接Access数据库。然后单击“Connection”选项卡,在“Select or enter a database name”框中选择需连接的Access数据库的路径及文件名,并在“Enter information to log on to the database”选项组中输入用户名和密码(可选项)。然后单击“Test Connection”按钮测试当前连接是否正确,如果连接无误,会打开“Test connection succeeded”确认对话框。

  随后需要设置TADOConnection控件的Connection属性为True,使数据库保持连接状态,并设置LoginPrompt属性为False,即连接时不再提示输入密码。

  经过前述步骤,程序已和目标Access数据库连接成功。

  3.数据表的操作

  添加TADOTable控件,命名为“ADOTable1”,并设置Connection属性值为“ADOConnection1”,使之关联,并设置TableName属性为需连接的Company表。最后设置Active属性为True打开数据表。

  为使控件和数据控件感知,还须添加TDataSource控件,并设置其DataSet属性为ADOTable1。

  4.添加数据遥感控件

  随后即可添加数据遥感控件,如TDBGrid、DBNavigator和DBEdit等,如图6所示:

  部分控件说明:添加一个DBGrid1控件,设置其DataSource属性为DataSource1,Options为“dgTitles,dgIndicator,dgColumnResize,dgColLines,dgRowLines,dgTabs,dgRowSelect,dgConfirmDelete,dgCancelOnExit”,ReadOnly为True;添加一个DBNavigator1控件,DataSource为DataSource1;再添加13个DBEdit控件,DataSource属性均为DataSource1,并分别设置其DataField属性为“公司全称”、“公司别名”、“所在城市”、“联系地址”、“联系电话”、“传真号码”、“邮政编码”、“Email”、“企业网址”、“银行账号”、“税号”、“信用度”、“经营范围”、及“备注”,最后将DBEdit1的ScrollBars属性设为ssVertical。

  由于Delphi数据库遥感控件的强大功能,因此几乎可不用编写代码,即可实现小型客户资源管理系统的大部分功能,如浏览、新增、修改、删除等。

  如需进一步增加程序的功能,如添加数据检索功能,可添加一个TLalel控件,设置其Caption值为“查询”,然后再添加一个Tedit控件,设其Text值为空,如图7所示:

  双击Edit1的OnChange事件,添加检索代码。

  procedure TForm1.Edit1Change(Sender: TObject);

  begin

  // loCaseInsensitive代表大小写不敏感,而loPartialKey表示模糊匹配

  ADOTable1.Locate(′公司全称′,Edit1.Text,[loCaseInsensitive,loPartialKey]);

  end;

  运行时,只需在“查询”处输入需查询的公司全称,程序将自动定位至最新匹配的记录行。

  四、数据库开发实例──DataSnap模式

  上述实例完成了一个简单的C/S(客户端/服务器)模式编程,但在实际需求中,多人同时访问数据库已经非常普及,因此本文将再介绍另一个DataSnap模式下的数据库编程实例。

  1.建立数据库

  为扩展数据库的同时连接数,使用MS SQL Server作为数据库。首先建立一个名为crm的数据库,再建立一个新表Company,其各个字段名和上例相同,如图8所示:

  2.连接数据库

  新建一个Delphi工程,然后在dbExpress控件组中添加TSQLConnection控件,命名为“SQLConnection1”,双击该控件,打开TSQLConnection的组件编辑器。单击组件编辑器左上角的“+”号,建立新的数据库连接。在“Driver Name”处可查看Delphi所支持的所有数据库。选择“MSSQL”选项,在“Connection Name”处输入“crm”即可。然后在组件编辑器的右侧,分别设置MS SQL Server的HostName、DataBase、User_Name、Password等值。

  随后将SQLConnection的Connection属性为True,使数据库保持连接状态并设置LoginPrompt属性为False,即连接时不再提示输入密码。

  3.访问数据库

  添加一个TSQLDataSet控件,设置SQLDataSet的SQLConnection值为SQLConnection1,CommandType属性为ctQuery,然后在CommandText属性栏中输入需查询的SQL语句(如“select * from company”),并将Active属性设为True。继续添加一个TdataSource控件,将其DataSet属性设为SQLDataSet1,然后按上面实例的方法添加除TDBGrid外所有的TLabel及TDBEdit控件,并按前述实例的控件属性值进行设置,如图9所示:

  随后即可运行程序,仔细观察运行结果后你会发现,TDBNavigarot中所有和修改数据有关的按钮,如新增、修改、删除、保存、取消刷新等,均为灰色而无法使用,即意味着无法使用TSQLDataSet来进行数据修改。另外,如单击“下一条记录”来移动数据库指针后,再单击“上一条记录”,程序将报错。意味着使用TSQLDataSet连接的数据记录集仅可向后单向移动指针,而无法向前回到前面的记录。

  那么,既然TSQLDataSet仅可查询,是否dbExpress的功能仅限于此?其实由于dbExpress融合了DataSnap技术,使其对数据访问的效率更高更安全。首先继续在上例程序中添加TdataSetProvider和TclientDataSet控件,并设置DataSetProvider1的DataSet属性值为SQLDataSet1。随后设置ClientDataSet1的ProviderName属性值为DataSetProvider1,并使Active值为True。修改DataSource1的DataSet属性的值为ClientDataSet1。

  此时继续运行程序,可发现TDBNavigator的新增、修改、删除按钮均可正常工作,且记录也可正常移动。但此时修改记录并保存会发现后台MS SQL Server数据库中的相应记录并未被修改。原因在于使用DataSnap的应用程序中,当应用程序修改数据时,事实上仅将将数据更新至DataSnap管理的缓存内存中,而并未真正更新至后台数据库。如需真正使数据更新,还须调用TclientDataSet的ApplyUpdates方法。继续新增TButton按钮,设置Caption属性为“全部更新”。双击该按钮,输入事件代码。

  procedure TForm1.Button1Click(Sender: TObject);

  begin

  //ApplyUpdates代表更新过程中不允许发生任何错误。

   ClientDataSet1.ApplyUpdates(0);

  end;

  其实上述代码即为最常用的MIDAS数据连接方法,不过利用TSimpleDataSet控件,还可进一步来简化dbExpress的数据库应用程序的开发方式。继续上例的程序,删除窗体中的TSQLConnection、TSQLDataSet、TdataSetProvider和TclientDataSet等非可视数据库控件,并添加一个TSimpleDataSet控件。

  首先,展开SimpleDataSet1的Connection属性,设置ConnectionName为crm,LoginPrompt为False,Connected为True。然后展开DataSet属性,分别设置CommandType为ctQuery,CommandText内输入“Select * from company”,设置Active值为True,并设置SimpleDataSet1的Active属性值为True。最后修改DataSource1的DataSet属性值为SimpleDataSet1即可,如图10所示:

  最后双击Tbutton控件,输入事件代码。

  procedure TForm1.Button1Click(Sender: TObject);

  begin

   SimpleDataSet1.ApplyUpdates(0);

  end;