第一章 设计数据库应用程序
数据库应用程序允许用户与存储在数据库中的信息进行交互。数据库提供了信息的结构,供不同的应用程序共享。
Delphi 4支持关系型数据库。关系型数据库以行和列即表格的形式来组织信息。当您设计一个数据库应用程序的时候,必须了解数据的结构,这样才能设计出一个合适的用户界面来显示数据库中的数据并且允许用户输入新的数据或者修改已有的数据。
1.1 使用
数据库构件选项板的“Data Access”页上的构件用于读写数据库,这些构件都借助于BDE(Borland Database Engine)来访问数据库中的信息。
Delphi 4的不同版本所包含的数据库驱动程序有所不同。不过,所有的版本都包含了访问本地数据库的驱动程序,而Client/Server版本和Enterprise版本还 包含了SQL Links用于访问远程数据库。究竟使用本地数据库还是远程数据库取决于几个方面的因素,例如,表格中要存储多少数据,有多少用户要同时访问数据库,对数据库的性能有什么要求。
1.1.1 本地数据库和远程数据库
本地数据库位于本地磁盘或局域网上。如果有几个用户同时访问数据库,本地数据库采取基于文件的锁定策略,因此,本地数据库又叫基于文件的数据库。
正因为本地数据库往往与数据库应用程序在同一个系统中,因此,访问本地数据库的速度比访问远程数据库的速度要快。
本地数据库所能存储的数据没有远程数据库所能存储的数据多,在选择使用本地数据库还是远程数据库时必须考虑到这一点。
使用本地数据库的应用程序也称为单层应用程序,因为数据库和应用程序在同一个文件系统中。
典型的本地数据库有Paradox、dBASE、FoxPro和Access。
远程数据库通常位于远程计算机上,用户通过SQL(Structured QueryLanguage)来访问远程数据库中的数据,正是基于这个原因,远程数据库有时候也叫SQL服务器或者叫RDBMS(Remote Database Management System)。
远程数据库非常适合于几个用户同时访问,与那些基于文件锁定策略的本地数据库不同的是,远程数据库提供了基于事务的多用户支持。
远程数据库所能存储的数据也比本地数据库多得多,甚至有时候数据并不 在一个服务器上,而是分布在几个服务器上。
使用远程数据库的应用程序称为两层或多层应用程序,因为数据库和应用程序位于彼此不依赖的系统(层)中。
典型的SQL服务器有Interbase、Oracle、Sybase、Informix、Microsoft SQLServer和DB2。
1.1.2 数据库的安全性
数据库往往包含了一些敏感信息。为了保护这些信息,不同的数据库有不同的保护策略。有的数据库如Paradox和dBASE,仅仅在表格级或字段级提供了安全保护,当一个用户试图访问受保护的表格时,他必须输入口令。当口令被认可,他只能看到允许的字段。
大部分SQL服务器需要用户输入用户名和口令,一旦用户成功地登录到服务器,他所能看到的表格以及能进行的操作与他输入的用户名和口令有关。
当您设计一个数据库应用程序的时候,必须考虑到数据库服务器需要什么样的安全措施。例如,如果不想让用户输入口令,您要么使用不需要口令的数据库,要么在程序中就把用户名和口令提供好,不过,在程序中提供用户名和口令容易泄密。
如果需要用户输入口令,还必须考虑什么时候输入口令。如果正在使用一个本地数据库但希望将来能够平滑地过渡到一个大型的SQL数据库,最好在打开一个表之前提示用户输入口令,尽管现在还可能用不着口令。
有的服务器可能需要多重口令,为了简化用户的操作,可以只要求用户输入一个主口令,其余的口令由程序自动提供。
在多层的Client/Server应用程序中,可能要同时用到不同的安全模式,例如,用CORBA或MTS控制访问中间层,再让中间层去处理登录到远程数据库的细节。
1.1.3 事务
一个事务实际上是一组动作,这些动作必须在一个或几个表被提交之前成功地执行。如果有某个动作执行失败,所有的动作都将滚回(Undo)。
大部分本地数据库不支持事务,但BDE驱动程序还是提供了有限的事务处理能力。而SQL数据库和ODBC兼容的数据库本身就提供了处理事务的能力。
1.1.4 数据字典
不管使用本地数据库还是远程数据库,应用程序都有权访问数据字典。数据字典提供了一个可自定义的不依赖于应用程序的存储区域,在这个区域中,可以创建扩展的字段属性集和描述数据的内容和外观。
例如,如果要经常开发财务软件,可以创建几个特殊的字段属性集,以不同的格式显示金额。当在设计期创建数据集时,就不需要用对象观察器手工设置金额字段的显示格式,只要从数据字典中选择一个合适的属性集,让当前数据集中的金额字段共享它的属性。使用数据字典能保证数据具有一致的外观。
在Client/Server环境下,数据字典可以位于远程服务器上。
位于...DELPHI4/LIB目录中的DRINTF单元提供了访问数据字典的编程接口。
1.1.5 完整性验证、存储过程和触发器
所有的关系数据库都提供了存储和操作数据的功能。此外,有些数据库还提供了有助于保证数据完整的功能。
一是完整性验证。这个功能提供了一种机制,能够防止两个表之间的Master/Detail关系被打断。当用户试图删除Master表中的一个字段时,如果这个字段被删掉将导致Detail表中出现孤立的记录,完整性验证功能要么不允许删除这个字段,要么把孤立的记录删掉。
二是存储过程。存储过程实际上是一组SQL语句,它们放在SQL服务器上,这些SQL语句能够执行与数据库相关的任务,然后返回执行结果(记录集)。三是触发器。触发器也是一组SQL语句,这些语句将在响应某个命令时被触发执行。
1.2 数据库应用程序的体系结构
一个数据库应用程序在逻辑上通常由两部分组成:一是数据库访问链路,二是用户界面,这就是数据库应用程序的体系结构。
1.2.1 选择合适的体系结构
建议最好把实现数据访问链路的构件与实现用户界面的构件分开,凡是数据访问构件最好放在数据模块上,这样能够保证应用程序具有一致的用户界面。如果把设计好的数据模块和窗体加到对象库中,在创建一个新的数据库应用程序时就不必什么都从头开始,这样不但能够提高编程效率,而且能够保证程序具有一致的风格。
数据库应用程序的体系结构取决于是使用本地数据库还是远程数据库,取决于同时访问数据库的用户数以及数据库中需要存储哪些类型的信息。
如果数据库中的信息不需要在几个用户之间共享,建议使用本地数据库,可以获得较快的访问速度,而且不必购买昂贵的服务器。不过,本地数据库所能存储的数据容量是有限的。
如果需要存储很多的信息,最好改用远程数据库。不过,两层的体系结构需要SQL Links的支持,而SQL Links只有Delphi 4的Client/Server和Enterprise版本中才包含有。
如果表与表之间的信息存在着比较复杂的关系,或者用户的数量增加了,建议您考虑多层的体系结构。与两层的应用程序相比。多层的应用程序多了一个中间层,中间层用于集中处理应用逻辑,这样,不同用途的客户程序可以使用相同的数据并且保证数据逻辑是一致的。同时,客户程序可以做得比较小巧,因为相当大的一部分工作由中间层去做了,这就是所谓的“瘦”客户。“瘦”客户更容易安装、配置和维护,因为它不需要包含数据库访问链路,不需要BDE。用多层的体系结构还有个好处是,可以把数据处理的任务分布在几个不同的系统中完成。当然,只有Client/Server和Enterprise版本才支持多层的体系结构。
不过,层数越多,开发难度和费用就越大,因此,开发数据库应用程序时,最好先从单层开始,随着数据和用户的增加,再逐步平滑地过渡到多层体系结构。这里的关键是,一开始就要考虑到体系结构的可伸缩性,以最大限度地重用代码,使用以前的投资。
1.2.2 可伸缩性
BDE的结构以及数据模块的使用使可伸缩性成为可能。不管是单层、两层还是多层,都可以把用户界面与数据访问链路分开,如图1.1所示
其中,窗体主要用于实现用户界面,它的主要部件是数据控件。数据模块主要用于实现数据访问链路,换句话说,就是引入数据集。数据集与数据控件之间通过TDataSource构件连接。把用户界面与数据访问链路分开的好处是,当应用程序以后过渡到多层体系结构时,只有数据模块上的数据集构件需要修改,而用户界面不需要变动。
不过,有的用户界面可能需要相应地变动,例如,不同的数据库有不同的安全策略,有的数据库要求登录,而有的数据库可能不需要登录。
BDE本身就具有可伸缩性,要把一个基于BDE的单层应用程序过渡到两层应用程序,这非常简单,只要修改数据集连接一个SQL服务器就行了。
要把一个基于TClientDataSet构件的单层应用程序过渡到多层应用程序,也是非常容易的,因为TClientDataSet 同时支持从文件中存取数据和通过IProvider接口存取数据。
如果计划过渡到三层的体系结构,可以先按单层或两层设计,除了要把用户界面分开外,还要把应用逻辑分开,因为应用逻辑最终要放到中间层即应用服务器上。在设计用户界面时,可以暂时用本地数据库提供数据,以后再改用TClientDataSet获取数据。
图1.2 单层数据库应用程序的体系结构
1.2.3 单层的数据库应用程序
在单层的数据库应用程序中,应用程序和数据库共享同一个文件系统,它们使用本地数据库或文件来存取数据。
一个单层的数据库应用程序同时包含了用户界面和数据访问机制(可能是通过BDE,也可能是通过文件)。图1.2是单层数据库应用程序的体系结构。可以看出,既可以通过基于BDE的数据集构件从本地数据库中获取数据,也可以通过TClientDataSet构件从文件中获取数据。有一个共同点是,它们都通过TDataSource构件向用户界面提供数据。
1.2.4 两层的数据库应用程序
在两层的数据库应用程序中,客户程序提供用户界面,通过BDE从远程数据库服务器获取数据。图1.3是两层数据库应用程序的体系结构。
图1.3 两层数据库应用程序的体系结构
在这种模式下,所有的应用程序都是客户,客户通过BDE与远程数据库服务器交换数据。一个服务器可以同时处理许多客户的请求,协调访问并且更新数据。
1.2.5 多层的数据库应用程序
在多层的数据库应用程序中,客户程序、应用服务器和远程服务器分布在不同的机器上。其中,客户程序主要提供用户界面,它能够向应用服务器请求数据和申请更新数据。再由应用服务器(又叫Remote Data Broker)向远程数据库服务器请求数据和申请更新数据。图1.4是多层数据库应用程序的体系结构。
图1.4 多层数据库应用程序的体系结构
Delphi 4既可以创建客户程序,也可以创建应用服务器。客户程序通过IProvider接口与应用服务器通讯,通讯的协议可以是TCP/IP、DCOM、MTS或 CORBA。通讯协议与客户程序上的MIDAS连接构件有关,也与应用服务器上的数据模块有关。
应用服务器通过IProvider接口有几种方式。如果应用服务器上包含TDataSetProvider构件或TProvider构件,IProvider接口将由这两个构件提供。如果应用服务器上没有TDataSetProvider构件和TProvider构件,IProvider接口由基于BDE的数据集构件提供。用TDataSetProvider构件或TProvider构件提供IProvider接口的好处是可以对IProvider接口进行控制。不过,不管哪种情况,IProvider接口都能在客户程序与应用服务器之间传递数据。
在多层模式下,几个客户有可能同时与一个应用服务器通讯,应用服务器实际上充当了一个网关的作用。
1.3 设计用户界面
构件选项板的“Data Controls”页上的构件(也叫数据控件)用于显示数据库的数据,并且让用户编辑数据并保存到数据库中。数据控件构成了数据库应用程序的用户界面(UI)。
数据控件通过TDataSource构件与数据库连接,TDataSource构件就好像用户界面与数据库之间的导管。在同一个窗体上,几个数据控件可以连接到同一个TDataSource构件,这几个数据控件能够保持同步,因为数据控件总是显示当前记录的数据。TDataSource构件一般放在数据模块上,与用户界面分开。
数据控件有好几种,使用哪个数据控件取决于要显示的数据的类型,也取决于怎样组织这些信息、怎样让用户浏览信息和怎样让用户编辑数据的方式。
1.3.1 显示单条记录和多条记录
很多情况下,在同一个时刻应用程序只需要显示一条记录即当前记录的数据,事实上,构件选项板上的数据控件大多数是为显示当前记录的数据而设计的,如TDBText构件。
如果要同时显示多条记录,就要用TDBGrid构件或TDBCtrlGrid构件。这两个构件既可以显示多条记录,也可以显示多个字段。
两个表之间可以建立Master/Detail关系,相应地,客户程序可以用一个TDBText构件显示Master表的某个字段,用一个TDBGrid构件显示Detail表的多条记录。
1.3.2 分析数据
有些数据库应用程序并不是直接把数据库中的原始数据显示给用户,而是对数据进行分析、统计后以一种恰当的方式显示出来,这样能够帮助用户从中得出结论。
构件选项板的“Data Controls”页上有一个TDBChart构件,这个构件能够以图表的形式对数据进行分析和显示。如果您购买的是Delphi 4的Client/Server版本,构件选项板上将有“Decision Cube”页。这一页上的构件能够对数据进行多维分析和统计,并以栅格和图表的形式显示出来。
1.3.3 选择要显示的数据
一个数据库应用程序往往只关心数据库中的一部分数据,比如,有的程序只关心一部分字段,而有的程序只关心一部分记录。
至于怎样取出关心的数据,这取决于您使用的数据集构件。一个数据库应用程序中可能使用了几个数据集构件。Delphi 4支持六种类型的数据集。
TTable构件。在逻辑上代表一个表。可以通过创建永久字段对象来调整字段的外观,可以增加Lookup字段和计算字段,可以设置过滤条件和范围来选择记录。
TQuery构件。可以对数据库进行查询,并返回符合条件的记录。
TStoredProc构件。用于执行SQL服务器上的存储过程。存储过程也可以返回符合特定条件的记录。
TClientDataSet构件。能够从应用服务器检索数据,在本地内存中复制一个副本。正是基于这个原因,TClientDataSet能同时工作的记录数是有限的。用TClientDataSet 建立的客户程序可以做得很小,因为它不需要依赖于BDE,只需要DBClient.DLL文件。TClientDataSet既可以从应用服务器取得数据,也可以从文件中取得数据。
TNestedTable构件。用于访问嵌套表中的记录。尽管Delphi 4不能直接创建Oracle8类型的表,但是可以显示和编辑嵌套表中的数据。
自定义的数据集构件。它是从TDataSet继承下来的,与上述标准的数据集构件不同的是,自定义的数据集构件得自己解释记录缓冲区中的内容。对于自定义的数据集来说,仍然可以使用字段编辑器,也可以使用标准的数据控件显示数据。
数据库应用程序允许用户与存储在数据库中的信息进行交互。数据库提供了信息的结构,供不同的应用程序共享。
Delphi 4支持关系型数据库。关系型数据库以行和列即表格的形式来组织信息。当您设计一个数据库应用程序的时候,必须了解数据的结构,这样才能设计出一个合适的用户界面来显示数据库中的数据并且允许用户输入新的数据或者修改已有的数据。
1.1 使用
数据库构件选项板的“Data Access”页上的构件用于读写数据库,这些构件都借助于BDE(Borland Database Engine)来访问数据库中的信息。
Delphi 4的不同版本所包含的数据库驱动程序有所不同。不过,所有的版本都包含了访问本地数据库的驱动程序,而Client/Server版本和Enterprise版本还 包含了SQL Links用于访问远程数据库。究竟使用本地数据库还是远程数据库取决于几个方面的因素,例如,表格中要存储多少数据,有多少用户要同时访问数据库,对数据库的性能有什么要求。
1.1.1 本地数据库和远程数据库
本地数据库位于本地磁盘或局域网上。如果有几个用户同时访问数据库,本地数据库采取基于文件的锁定策略,因此,本地数据库又叫基于文件的数据库。
正因为本地数据库往往与数据库应用程序在同一个系统中,因此,访问本地数据库的速度比访问远程数据库的速度要快。
本地数据库所能存储的数据没有远程数据库所能存储的数据多,在选择使用本地数据库还是远程数据库时必须考虑到这一点。
使用本地数据库的应用程序也称为单层应用程序,因为数据库和应用程序在同一个文件系统中。
典型的本地数据库有Paradox、dBASE、FoxPro和Access。
远程数据库通常位于远程计算机上,用户通过SQL(Structured QueryLanguage)来访问远程数据库中的数据,正是基于这个原因,远程数据库有时候也叫SQL服务器或者叫RDBMS(Remote Database Management System)。
远程数据库非常适合于几个用户同时访问,与那些基于文件锁定策略的本地数据库不同的是,远程数据库提供了基于事务的多用户支持。
远程数据库所能存储的数据也比本地数据库多得多,甚至有时候数据并不 在一个服务器上,而是分布在几个服务器上。
使用远程数据库的应用程序称为两层或多层应用程序,因为数据库和应用程序位于彼此不依赖的系统(层)中。
典型的SQL服务器有Interbase、Oracle、Sybase、Informix、Microsoft SQLServer和DB2。
1.1.2 数据库的安全性
数据库往往包含了一些敏感信息。为了保护这些信息,不同的数据库有不同的保护策略。有的数据库如Paradox和dBASE,仅仅在表格级或字段级提供了安全保护,当一个用户试图访问受保护的表格时,他必须输入口令。当口令被认可,他只能看到允许的字段。
大部分SQL服务器需要用户输入用户名和口令,一旦用户成功地登录到服务器,他所能看到的表格以及能进行的操作与他输入的用户名和口令有关。
当您设计一个数据库应用程序的时候,必须考虑到数据库服务器需要什么样的安全措施。例如,如果不想让用户输入口令,您要么使用不需要口令的数据库,要么在程序中就把用户名和口令提供好,不过,在程序中提供用户名和口令容易泄密。
如果需要用户输入口令,还必须考虑什么时候输入口令。如果正在使用一个本地数据库但希望将来能够平滑地过渡到一个大型的SQL数据库,最好在打开一个表之前提示用户输入口令,尽管现在还可能用不着口令。
有的服务器可能需要多重口令,为了简化用户的操作,可以只要求用户输入一个主口令,其余的口令由程序自动提供。
在多层的Client/Server应用程序中,可能要同时用到不同的安全模式,例如,用CORBA或MTS控制访问中间层,再让中间层去处理登录到远程数据库的细节。
1.1.3 事务
一个事务实际上是一组动作,这些动作必须在一个或几个表被提交之前成功地执行。如果有某个动作执行失败,所有的动作都将滚回(Undo)。
大部分本地数据库不支持事务,但BDE驱动程序还是提供了有限的事务处理能力。而SQL数据库和ODBC兼容的数据库本身就提供了处理事务的能力。
1.1.4 数据字典
不管使用本地数据库还是远程数据库,应用程序都有权访问数据字典。数据字典提供了一个可自定义的不依赖于应用程序的存储区域,在这个区域中,可以创建扩展的字段属性集和描述数据的内容和外观。
例如,如果要经常开发财务软件,可以创建几个特殊的字段属性集,以不同的格式显示金额。当在设计期创建数据集时,就不需要用对象观察器手工设置金额字段的显示格式,只要从数据字典中选择一个合适的属性集,让当前数据集中的金额字段共享它的属性。使用数据字典能保证数据具有一致的外观。
在Client/Server环境下,数据字典可以位于远程服务器上。
位于...DELPHI4/LIB目录中的DRINTF单元提供了访问数据字典的编程接口。
1.1.5 完整性验证、存储过程和触发器
所有的关系数据库都提供了存储和操作数据的功能。此外,有些数据库还提供了有助于保证数据完整的功能。
一是完整性验证。这个功能提供了一种机制,能够防止两个表之间的Master/Detail关系被打断。当用户试图删除Master表中的一个字段时,如果这个字段被删掉将导致Detail表中出现孤立的记录,完整性验证功能要么不允许删除这个字段,要么把孤立的记录删掉。
二是存储过程。存储过程实际上是一组SQL语句,它们放在SQL服务器上,这些SQL语句能够执行与数据库相关的任务,然后返回执行结果(记录集)。三是触发器。触发器也是一组SQL语句,这些语句将在响应某个命令时被触发执行。
1.2 数据库应用程序的体系结构
一个数据库应用程序在逻辑上通常由两部分组成:一是数据库访问链路,二是用户界面,这就是数据库应用程序的体系结构。
1.2.1 选择合适的体系结构
建议最好把实现数据访问链路的构件与实现用户界面的构件分开,凡是数据访问构件最好放在数据模块上,这样能够保证应用程序具有一致的用户界面。如果把设计好的数据模块和窗体加到对象库中,在创建一个新的数据库应用程序时就不必什么都从头开始,这样不但能够提高编程效率,而且能够保证程序具有一致的风格。
数据库应用程序的体系结构取决于是使用本地数据库还是远程数据库,取决于同时访问数据库的用户数以及数据库中需要存储哪些类型的信息。
如果数据库中的信息不需要在几个用户之间共享,建议使用本地数据库,可以获得较快的访问速度,而且不必购买昂贵的服务器。不过,本地数据库所能存储的数据容量是有限的。
如果需要存储很多的信息,最好改用远程数据库。不过,两层的体系结构需要SQL Links的支持,而SQL Links只有Delphi 4的Client/Server和Enterprise版本中才包含有。
如果表与表之间的信息存在着比较复杂的关系,或者用户的数量增加了,建议您考虑多层的体系结构。与两层的应用程序相比。多层的应用程序多了一个中间层,中间层用于集中处理应用逻辑,这样,不同用途的客户程序可以使用相同的数据并且保证数据逻辑是一致的。同时,客户程序可以做得比较小巧,因为相当大的一部分工作由中间层去做了,这就是所谓的“瘦”客户。“瘦”客户更容易安装、配置和维护,因为它不需要包含数据库访问链路,不需要BDE。用多层的体系结构还有个好处是,可以把数据处理的任务分布在几个不同的系统中完成。当然,只有Client/Server和Enterprise版本才支持多层的体系结构。
不过,层数越多,开发难度和费用就越大,因此,开发数据库应用程序时,最好先从单层开始,随着数据和用户的增加,再逐步平滑地过渡到多层体系结构。这里的关键是,一开始就要考虑到体系结构的可伸缩性,以最大限度地重用代码,使用以前的投资。
1.2.2 可伸缩性
BDE的结构以及数据模块的使用使可伸缩性成为可能。不管是单层、两层还是多层,都可以把用户界面与数据访问链路分开,如图1.1所示
其中,窗体主要用于实现用户界面,它的主要部件是数据控件。数据模块主要用于实现数据访问链路,换句话说,就是引入数据集。数据集与数据控件之间通过TDataSource构件连接。把用户界面与数据访问链路分开的好处是,当应用程序以后过渡到多层体系结构时,只有数据模块上的数据集构件需要修改,而用户界面不需要变动。
不过,有的用户界面可能需要相应地变动,例如,不同的数据库有不同的安全策略,有的数据库要求登录,而有的数据库可能不需要登录。
BDE本身就具有可伸缩性,要把一个基于BDE的单层应用程序过渡到两层应用程序,这非常简单,只要修改数据集连接一个SQL服务器就行了。
要把一个基于TClientDataSet构件的单层应用程序过渡到多层应用程序,也是非常容易的,因为TClientDataSet 同时支持从文件中存取数据和通过IProvider接口存取数据。
如果计划过渡到三层的体系结构,可以先按单层或两层设计,除了要把用户界面分开外,还要把应用逻辑分开,因为应用逻辑最终要放到中间层即应用服务器上。在设计用户界面时,可以暂时用本地数据库提供数据,以后再改用TClientDataSet获取数据。
图1.2 单层数据库应用程序的体系结构
1.2.3 单层的数据库应用程序
在单层的数据库应用程序中,应用程序和数据库共享同一个文件系统,它们使用本地数据库或文件来存取数据。
一个单层的数据库应用程序同时包含了用户界面和数据访问机制(可能是通过BDE,也可能是通过文件)。图1.2是单层数据库应用程序的体系结构。可以看出,既可以通过基于BDE的数据集构件从本地数据库中获取数据,也可以通过TClientDataSet构件从文件中获取数据。有一个共同点是,它们都通过TDataSource构件向用户界面提供数据。
1.2.4 两层的数据库应用程序
在两层的数据库应用程序中,客户程序提供用户界面,通过BDE从远程数据库服务器获取数据。图1.3是两层数据库应用程序的体系结构。
图1.3 两层数据库应用程序的体系结构
在这种模式下,所有的应用程序都是客户,客户通过BDE与远程数据库服务器交换数据。一个服务器可以同时处理许多客户的请求,协调访问并且更新数据。
1.2.5 多层的数据库应用程序
在多层的数据库应用程序中,客户程序、应用服务器和远程服务器分布在不同的机器上。其中,客户程序主要提供用户界面,它能够向应用服务器请求数据和申请更新数据。再由应用服务器(又叫Remote Data Broker)向远程数据库服务器请求数据和申请更新数据。图1.4是多层数据库应用程序的体系结构。
图1.4 多层数据库应用程序的体系结构
Delphi 4既可以创建客户程序,也可以创建应用服务器。客户程序通过IProvider接口与应用服务器通讯,通讯的协议可以是TCP/IP、DCOM、MTS或 CORBA。通讯协议与客户程序上的MIDAS连接构件有关,也与应用服务器上的数据模块有关。
应用服务器通过IProvider接口有几种方式。如果应用服务器上包含TDataSetProvider构件或TProvider构件,IProvider接口将由这两个构件提供。如果应用服务器上没有TDataSetProvider构件和TProvider构件,IProvider接口由基于BDE的数据集构件提供。用TDataSetProvider构件或TProvider构件提供IProvider接口的好处是可以对IProvider接口进行控制。不过,不管哪种情况,IProvider接口都能在客户程序与应用服务器之间传递数据。
在多层模式下,几个客户有可能同时与一个应用服务器通讯,应用服务器实际上充当了一个网关的作用。
1.3 设计用户界面
构件选项板的“Data Controls”页上的构件(也叫数据控件)用于显示数据库的数据,并且让用户编辑数据并保存到数据库中。数据控件构成了数据库应用程序的用户界面(UI)。
数据控件通过TDataSource构件与数据库连接,TDataSource构件就好像用户界面与数据库之间的导管。在同一个窗体上,几个数据控件可以连接到同一个TDataSource构件,这几个数据控件能够保持同步,因为数据控件总是显示当前记录的数据。TDataSource构件一般放在数据模块上,与用户界面分开。
数据控件有好几种,使用哪个数据控件取决于要显示的数据的类型,也取决于怎样组织这些信息、怎样让用户浏览信息和怎样让用户编辑数据的方式。
1.3.1 显示单条记录和多条记录
很多情况下,在同一个时刻应用程序只需要显示一条记录即当前记录的数据,事实上,构件选项板上的数据控件大多数是为显示当前记录的数据而设计的,如TDBText构件。
如果要同时显示多条记录,就要用TDBGrid构件或TDBCtrlGrid构件。这两个构件既可以显示多条记录,也可以显示多个字段。
两个表之间可以建立Master/Detail关系,相应地,客户程序可以用一个TDBText构件显示Master表的某个字段,用一个TDBGrid构件显示Detail表的多条记录。
1.3.2 分析数据
有些数据库应用程序并不是直接把数据库中的原始数据显示给用户,而是对数据进行分析、统计后以一种恰当的方式显示出来,这样能够帮助用户从中得出结论。
构件选项板的“Data Controls”页上有一个TDBChart构件,这个构件能够以图表的形式对数据进行分析和显示。如果您购买的是Delphi 4的Client/Server版本,构件选项板上将有“Decision Cube”页。这一页上的构件能够对数据进行多维分析和统计,并以栅格和图表的形式显示出来。
1.3.3 选择要显示的数据
一个数据库应用程序往往只关心数据库中的一部分数据,比如,有的程序只关心一部分字段,而有的程序只关心一部分记录。
至于怎样取出关心的数据,这取决于您使用的数据集构件。一个数据库应用程序中可能使用了几个数据集构件。Delphi 4支持六种类型的数据集。
TTable构件。在逻辑上代表一个表。可以通过创建永久字段对象来调整字段的外观,可以增加Lookup字段和计算字段,可以设置过滤条件和范围来选择记录。
TQuery构件。可以对数据库进行查询,并返回符合条件的记录。
TStoredProc构件。用于执行SQL服务器上的存储过程。存储过程也可以返回符合特定条件的记录。
TClientDataSet构件。能够从应用服务器检索数据,在本地内存中复制一个副本。正是基于这个原因,TClientDataSet能同时工作的记录数是有限的。用TClientDataSet 建立的客户程序可以做得很小,因为它不需要依赖于BDE,只需要DBClient.DLL文件。TClientDataSet既可以从应用服务器取得数据,也可以从文件中取得数据。
TNestedTable构件。用于访问嵌套表中的记录。尽管Delphi 4不能直接创建Oracle8类型的表,但是可以显示和编辑嵌套表中的数据。
自定义的数据集构件。它是从TDataSet继承下来的,与上述标准的数据集构件不同的是,自定义的数据集构件得自己解释记录缓冲区中的内容。对于自定义的数据集来说,仍然可以使用字段编辑器,也可以使用标准的数据控件显示数据。