第十一章: 数据库应用程序设计的高级技巧
本章重点:
1:分析使用ado组件的效率及差异
2:data modle的使用:
3:数据集控件的游标类型adoconnection组件的隔离级别和数据集控件的.
4:数据库错误的处理:
5:一对多表的设置:
6:事务的应用:
分析使用ado组件的效率及差异:
众所周知,我们现在使用的全部都是关系型数据库,而关系型数据库它只认得sql语句。不论你写入或修改或删除,或查询关系型数据库内的数据,你都必须以sql命令的方式进行。而前台开发工具必须通过网络把它的请求发送给后台数据库,当后台数据库接收到前台传来的sql命令之后,第一步要进行的的工作就是分析sql语句的命令是否正确。包括:
A:sql语法是否正确。
B:检查sql命令中使用到的数据字段及表是否存数据库中。
C:前台用户是否有权限来访问这些字段或表.
但是我们会发现我们实际上对数据库进行操作时,不都是sql语句,比如:table1.delete,或table1.append等而后台数据库只认识sql语句,那么数据库怎么能够接受不是sql的语句的呢?原来是ado,或bde充当的翻译的角色。明白了这一点,我们应该可以了解,当使用table组件的方法对数据库进行操作时,必须要把这种操作转化成为sql语句,而用query组件对数据库进行操作时,不必要把它转化成sql语句,显然少了翻译这一步.
那么我们可以知道。使用query组件的效率要大于使用table组件的效率.我们再来看一下store proc组件,这一组件是专门用来执行在服务器上存储过程的。我们已经知道,当后台数据库在接受到前台的请求时,会对sql语句进行复杂的检查,所以会耗去不少的时间,而存储过程(一组预先编译好的sql命令的集合)在创建的时候就会对它里面的sql作检查,并把这些结果存储在系统表中,当你下次再调用这个storeproce时,数据库引擎将不再对sql语句作检查,直接取出系统表中事先已经检查好的结果。如此一来,将省了不少和时间.
综上所述:最快的就是tstoredproc组件,其次是tquery组件,再次是table.那是不是说我们就不用table和query了呢?
1:如果你不需要通过查询来操作数据库,并且所处理的结果集比较少那么请用adotable。虽然效率比较低, 但是操作起来非常简单
2: 如果你必须要使用sql语句来操作数据库。那么又分为以下两点:
1):如果你写的sql语句,不是很多,并且不是经常使用,则应该选择qdoquery组件
2):如果你写的sql语句比较复杂,并且要经常使用,请使用tadostoreproc组件。
问题思考:如果你的在项目开发中要用到48个table,12个query.并把这些组件放到不同的窗体上去,把active都设为true。你思考一下。你有两点做得非常不好,为什么.
数据模块(data module)
什么是数据模块及为什么要使用数据模块:
数据模块是数据库访问组件的集合中管理,你可以将数据访问组件集中放在数据模块中,让你工程所有form 都共享这个data module。它的好处是如果表结构有任何异动时,你只需要修改数据模块上的表组件即可。
数据集控件的游标类型与connection组件的隔离级别
数据集控件的游标类型:
在delphi中数据集控件的游标类型只有两种:客户端游标和服务器端游标.当你选择客户端游标时,游标的类型自动为静态了,也就是看不到其它客户对数据所作的修改,而当你选择服务器端游标时,游标的类型自动为动态的,也就说可以看到其它用户对数据的修改,但是此时不能用dbgrid来显示数据
connection组件的隔离级别:
为了处理并发问题,我们需要设置connection的隔离级别,在此你要知道一点那就是数据库的隔离级别是由生产该数据库的产商决定的,不是由delphi本身来决定的,换句话说,如果你在delphi中选择一个数据库不支持的级别,那是没有效果的。sqlserver数据库只支持三种级别:
1:ilReadCommitted:提交读
特点:在事务执行更新操作时:在事务没有提交之前,不能读或更新,但可以插入.
2:ilReadCommitted
特点:在事务执行读取操作时锁定查询中使用的所有数据(注意不是整个表),其它事务不能更新,但可以插入 数据或读取数据
3: ilSerializable:在事务执行读取操作时锁定整个表,其它事务不能更新也不能插入.
举列:
数据库错误的处理
当我们在开发完基于c/s模式的app时并交给用户使用时,用户可能在使用过程中,会输入一些使程序发生错误的数据。比如:对于主键的列,输入了重复的值,或者输入了违反了约束的值等。那么为了增强程序的容错性,就需要程序员在开发程序时,能够及时捕捉到这些错误。其它delphi捕捉错误的原理是这样的:当delphi把用户的操作转化为sql语句交给服务器处理时,如果这些sql语句发生了错误,服务器马上会把这个错误返回给前台的delphi,前台的delphi中数据集控件有一个poserror事件就会触发,如此一来,你将能在该事件写
上因错误要做的某些事件。
**********调用存储过程(在delphi中调用SQL中的存储过程)
form1.ADOStoredProc1.ProcedureName:='show';
form1.ADOStoredProc1.Parameters.Clear;
form1.ADOStoredProc1.Parameters.CreateParameter('@m',ftstring,pdinput,30,'程序员');
@m表示在SQL中要传入的参数名,'高级程序员班'是在DELPHI中传入值.pdinput表示输入
form1.ADOStoredProc1.Open;(open方法可以得到要换回的记录集)
ADOStoredProc1.execproc方法可以用于update,insert,delete
[举列]
一对多表的设置
设置一对多表的重要属性:
1:用adotable组件设置:
A:mastersource:主数据源
B:mastefileld:主字段
2:用adoquery组件来设置:
A:利用参数
B:datasource来设置:
事务的应用:
要在ado中执行事务,必须使用adoconnect组件begin tran与rolback和commit方法.
一般事务可以用在下述两个场合:
1:取消用户的操作。
2:确保数据完整性.
举列1....举列2
第十二章:三层结构数据库应用程序设计基础
1:多层结构程序设计基础。
2:多层数据库程序设计原理
3:编写第一个三层模式的应用程序.
4:编写多层结构基本的数据维护程序
5:在多层结构中使用事务
6:在多层结构中使用查询并把查询参数传递给应用程序服务器
7:如何在多层结构中把服务器的错误带回前台.
8:single instance及multiple instance的差异
9:前台程序与应用程序服务器之间的数据传递
10:让你在前台来设置一对多表的设置
11:利用briefcase功能来达到切断记录集的目的
12:利用tclientdataset组件来实现数据的统计功能
13:控制前台的权限
14:带有corba服务器的三层模式
15:报表的制作
三层模式的开发(分布式应用程序的开发)的基础
我们以前学的两层结构只包括前台delphi应用程序与后台数据库操作系统,前台的delphi负责界面描述,送出查询的sql命令给后台数据库等工作:而后台的数据库系统则负责接收前台传来的sql命令,并进行处理,最后将处理之后的结果送给前台的delphi.因此在整个c/s模式下你的程序会被切成两部分,分别放在前台的计算机上的和后台的服务器上.由引可见两层c/s模式存在以几点缺陷:
A:前台的用户越多,前台与后台之间的连接就越多,后台服务器的负担就越重,进而使整个系统速度减慢
打个比方:假如某一个公司有1000个职工,该公司与某个餐厅预约,每天中午12:00-13:00之间每一个员工都要打电话定餐,请你想像一下,在短短一个小时之内,该餐厅要接一千个电话,很显然会使该餐厅变异常繁芒。而且有些电话根本就打不进来。同样的道理,如果此时有1000个客户都要数据库服务器发出请求,就会使服务超负荷运行,那么1000个客户的运行速度就是整体下降。
B:前台程序的分发问题。当你使用两层结构开发完项目之后,由于你使用的数据集组件都在客户端。所以你必须要打包。那是因为,你不能只复制exe文件,因为只要用到了数据集组件,任何应用程序就会自动去调用dll.所以你在分发时候,也应该把对应的dll一起分发。而至于你编写的数据库app需要什么样的dll,这个可以交给delphi的打包程序去完成。尽管如此,如果你要把你开发好的项目给100个人使用,则你要安装100次。很显然比较麻烦。
C:容错问题:对于一般的两层结构而言,往往只有一个数据库服务器在运行。假如,此时这台数据库服务器因某种因素而死机了.那么其它的客户端将都不能使用。
正是因为存在这样的原因。所以delphi才出现了基于三层模式的数据库的app。那么为什么说三层模式的app就能够避免上述三个问题呢?
对于第一点来说:
解决的问题是,可以让公司的员工先打电话给专门的几个接线员,再由每一个接线员打一个“电话"给餐厅那些人需要什么样的饭菜,如此一来,餐厅接听电话的数目比以前可能从一千个骤减到几十个。同样的道理。我们可以在两层结构中加上一台被称为"应用程序服务器的"的服务器来处理前台传过来的请求,也就是将原本两层结构分布在客户端与数据库服务器端的工作,再重新分割成三部分。分别放在
前台----应用程序服务器------数据库服务器)三个地方来处理。这就是三层模式.很显然应用程序服务器将负责与前台的连接处理,把前台传来的请求经过加工处理再传给数据库服务器。或是把数据库服务器返回来的数据集返回前台的计算机。而数据库服务器则只需要一个与应用程序服务器的连接,其余时间将可以专心处理数据库的访问操作。不必再与前台打交道了,如些将大幅度减轻数据库服务器的负担,进行而提升整体工作性能
对于第二点来说:
为了解决前台程序安装的困扰。
对于两层结构,都是把数据集控件做在前台上,而delphi的三层结构却把数据集控件做到了应用程序服务器上,这样前台就只乘下一个exe了(实际上还必须包括一个midas.dll文件),让你的前台真正做到只负责界面描述
不需要再安装其它的软件,所以你再发布三层模式的数据库应用程序时,只需要把应用程序服务器安装一次,而把前台只复制exe文件就行了。更重要的是,当你要修改应用程序之后,只要把修改后的exe通过网络复制到前台即可。而不需要亲自到每一台前台的计算机上重新安装一次。另外,如果你的数据库结构发生了变化,你只要改变应用程序服务器的数据集控件就行了,前台不需要做任何修改.
对于第三点:
delphi的三层结构中提供了一个visiborker来管理应用程序服务器的运行。你可以在三层结构中时同运行三个应用程序服务器和一部数据库服务器。那么visiborker的功能有两点:
1:负载平衡:2:失败恢复
所谓负载平衡指的是,多个应用程序服务器来平均分担多个客户端的请求。而失败恢复是指,如果其中一个应用应用程序服务器失败了,则其它的应用程序服务器就会替补上综上所述:如果你开发的项目是一个基于网络企业内部多员工使用的项目,则应该考虑使用三层结构。这样,你可以用一个数据库服务器,一个或多个应用程序服务器,然后把前台的exe复制到企业内部的各个计算机中。即分布式应用程序。
但是如果你开发的项目不需要在企业内部进行多个使用,则应该使用简单的c/s模式。因为c/s模式开发的流程毕竟比较简单。