上一题下一题
跳转到
 
 
  世界如此多姿,发展如此迅速,窥一斑未必还能知全豹。但正如万花筒一样,每一个管窥都色彩斑斓。  
 
 
  知识通道 | 学习首页 | 教师首页 | PK首页 | 知识创造首页 | 企业首页 | 登录
 
本文对应知识领域
DELPHI语言总结(1)
作者:未知 申领版权
2010年12月12日 共有 1539 次访问 【添加到收藏夹】 【我要附加题目
受欢迎度:

    多层结构的设计原理
    如前所述,多层结构分成三部分。分别是前台应用程序,应用程序服务器,数据库服务器。那么它们各部分究竟是由那些组成的。
    A:前台的应用程序:
    这一部分就是我们用delphi加载的窗体,换句话说,就是面向用户的界面,不过在这个界面中应该还有一个dcom和midas.dll。dcom用于负责与应用程序服务器中com通信,而midas.dll则是进行三层结构设计所必须用的动态连接库
    B:应用程序服务器
    这一部分主要由二部分组成
    第一部分:com程序
    什么是com。com是(componnect object modal)的简称及组件对像模形,com是microst制定对像的规范及实现,这个规范中包括对像的创建规则,以及对像与对像之间的通信方式。为什么要使用com呢?我们知道前台要与应用程序服务器之间可能传递很多类型的数据,而且前台程序也会把许多不同类型的工作去交给应用程序服务器,那么我们是不是应该在应用程序服务器上定义各种不同的方法,以此去应付前台各种请求.这样,我们可以把应用程序服务器看成一个对像,在对像上要定义各种方法,去处理前台的请求把这些方法定义好之后,就可以让前台来调用该方法。而在delphi里面,把在com中定义的各种方法的过程被称为定义interface(接口),所以你应该这样来理解com:com就是一种对像,而在这一个对像里面定义各种方法(制作接口)以供外界来调用,而对于外界而言,根本不必要知道com里面的方法是怎么实现的,它只管调用.但是有一个问题还需要说明,在三层结构中,由于前台与应用程序服务器不在同一台计算机中,那么前台是通过什么把请求发送给应用程序服务器的。就是通过dcom。dcom就是分布式com.
    第二部分: remotedatamodule(远程数据模块)
    而这一部分里面通常会放上data access componet数据访问组件(tadotable,tadoquery,tadodataset...)和一个TDataSetProvider组件 [如图所示]
    
    编写第一个三层模式的应用程序:
    A:服务器:remotedatamoudle,数据集控件,tDataSetProvider1组件.
    属性:把tdatasetprovider1的dataset设置为tadotable或tadoquery控件就行了.
    为了让前台能够正确找到com程序,必须要把对应的com注册,你只要把运行一次,delphi就会自动帮你注册
    可以通过注册表查看一下。
    B:客户端:
    数据集控件,dcom组件,tcilentdataset控件
    把dcom的computername设置为应用程序服务器所在计算机的名字,把ServerGUID设置为应用程序注册的GUID
    把connection设置为true,则自动启动应用程序服务器
    设置为之后如果你要发布可以按如下步骤:
    1:首先把服务器的程序进行打包:
    2:再在发布的计算机上安装,并运行,这样就会把com注册到这一台计算机中.
    3:把前台的exe文件复制到客户端的计算机中.
    4:把midas.dll(在c:\winnt\system32下)复制到客户端的计算机的system32下面去撤
    
    编写三层模式的基本数据维护程序:
    具备知识点:
    在delphi的三层结构里面,tclientdataset在前台的程序中扮演着一个非常重要的角色。首先要明白真正发动sql操作的是ttable或tquery或tdataset控件等,当后台数据库产生resutl set之后,这些resulst set将会首先被丢到应用程序服务器,成为中间软件控制的dataset,接着就会通过tdatasetprovider传给前台的tclientdataset,而成为前台控件的dataset。这时候你就可以利用tclientdataset所提供的方法:
    insert,edit,delte,等来编辑数据。tclientdataset就会把变动的数据存放在属性delta内,最后可以通过
    tclientdataset的applyupdates来把前台变动的过的数据(delta)真正写回后台数据库
    举列:
    
    在三层结构程序中使用事务
    在两层结构中,我们是利用adoconnection组件的begintrans方法来实现事务的。可是在三层结构中,adoconnection的组件却放到了应用程序服务器上,所以我们必须在应用程序服务器上实现事务.
    事实上,当你在前台对某些数据进行修改时,这些数据只是放到前台的delta中去了,也就是说,即使你修改的数据与数据库的某个约束发生冲突时,这时前台依然充许你将数据写入delta中。当你调用applyupdates来把数据真正的写回数据库时,数据库再才对数据进行约束检验.那么为什么要在三层模式中使用事务呢?假设。你现在要在前台做两个操作。分别是删除一条数据,或修改某一条数据(你修改的值也数据库中的某个约束发生了冲突),之后你再应用applyupates想把数据写回后台数据库时,只有删除的请求会被提交,而修改的请求不会得到提交,而我们现在想实现要么都做,要么都不做。这个时候我们就应该用到事务
    DataSetProvider1.ApplyUpdates(data,0,errcount);这个方法会把变动的数据data(类型为variant)写入数据库。其中errcount表示写入时,发生的错误个数,如果该值比零大则说明产生了错误.该函数会返回一个variant值,这个值是指当错误发生时,还没有写入数据库的数据。
    举例:
    多层结构中使用查询
    在多层结构中,要使用查询,服务器端必须要使用tadoquery组件,然后在把在服务器上的datasetprovidre的options属性的poallowcommandtext设置为true,接着你可以在客户端的tclientdataset中通过commandtext属性来指明sql,当你调用tclientdataset组件的open方法,则会把客户端的sql传给服务器的tadoquery. 你也可以在查询中使用参数,你只要指定参数的值,以及参数的类型就行了   举列
    
    把服务器产生的错误带回前台
    由于服务器与前台不在同一台计算机上,所以如果更新数据发生错误,则只有服务器那边会发生错误,而在前台是看不到错误的,那么我们希望能够把服务器的错误带加前台。要实现这个功能我们必须要做两件事件。
    第一:如果知道服务器发生了错误.
    对于这个,我们可以判断tdatasetprivoder中的onupdateerror事件是否被执行了,如果被执行了,则错误肯定发生了。
    第二:错误发生了,怎么把错误带回前台。
    对于这个问题,你可以在服务器的com上定义一个接口,来返回错误提示的信息,然后前台把这个错误信息带回来,在前台来进行判断是那个错误,从而做出相应的处理。  [举例]
    
    single instance及multiple instance的差异
    当你在创建应用程序服务器的时候,delphi会让你指定as的运行模式。你有三个选择:
    1:internal 2:single instance  3:multiple
    一般as要么采用第二种或第三种,那么第二和与第三种之间究竟有什么区别呢?
    multiple instance:
    是指许多前台应用程序都共享同一个as,把as设置成multiple instnace的最大好处是启动及运行效率快,比较不会耗用服务器太多的系统资源,而且管理上也比较方便。但是采这个模式的应用程序服务器却隐藏着一个问题,那就是不具备多任务的处理能力。什么意思呢?假若现在有五个前台同时向as发出请求,而其中一个前台的请求要处理很大的数据,这样,后面的的查询必须要等这个查询做完之后才能做他自己的。很显然,这就像一个很狭窄的路,如果有一个车子停住了,后面的车子都不能走.了为解决multiple insnace的问题。就出现了single instance.这种模式与multiple instnace相反。每个连上as的前台程序都会产生一个应用程序服务器。那么,每个前台的查询都互不干扰。但是这样会加重服务器负担。因为服务器必须为每一个前台都启动一个as.你可能会说,那到底使用那一种好呢?答案是:按系统需求而定。你可以创建两组as一个为multiple一个为single的。而你也必须把程序分成两类。一类是查询数据量比较小的。另一种是查询数据量比较大的。对于查询数据量比较小的就用multiple,而查询数据量比较大的则使用single [举列证明]
    
    前台程序与应用程序服务器之间的数据传递
    通过前面的学习,你应该知道前台程序与应用程序服务器之间是通过dcom与datasetprivoder机制来互相沟通。当dataset从数据库服务器被下载到应用程序服务器之后,接下来就是通过dcom将dataset传给前台程序。由于dataset有时可能很大,有时也可能很小,这时候到底是一次传给前台,还是分好几次下载呢?前台程序中tclientdataset属性packetrecords就是用来控制一次要从应用程序服务器下载几条数据到前台程序来的。当
    此属性被设成为-1时,即表示要把整个dataset从应用程序服务器一次抓到前台上来。当此属性被设为成一个大于零的数时,表示一次性从应用程序服务器抓n条数据。很显然如果查询出的数据比较多时,强烈建议不要把此属性设置为-1,你可以设置一个值来控制前台与dataset之间的数据流量。
    
    让你在前台来设置一对表多的设置
    在三层模式中,要实现一对多的关系的方法有两种,一种是在as上面先设置好主从关系,再在前台来使用。
    第二种方法是直接到前台来进行主从的设置。但是这一种方法有一个致命的缺点。打个比方:比如我们要设置客户与订单之间的主从关系。按道理当用户在主表中选择某一个customerid号,从表应该显示出他所有订购单。但是在三层结构中,应用程序服务器会怎么做呢?他会首先把订购单表中的所有数据从sql里面下载过来,然后传到前台缓冲区内,前台再根据主从对应关系从缓冲区内取出你在主表选择的的客户所对应的所有记录。如果订购单表有很大,那么前台程序要等多久才能抓到整个订单表呢?所以我们要选择第一种,在第一种方法中前台选中那个客户,as就只会从sql中下载与之对应的订单,而不是整个订单.[举列]
    
    在三层结构中实现切断记录集的目的
    
    什么是"切断记录集"呢?我们知道,前台是通过as把数据取过来,并加工,再通过as传给sqlserver的。假设现在有100个客户要把从as中取数据,并加工之后传给as.那么这100个客户必须要首先连上as,并取得数据,之后再进行修改,再把修改之后的结果通过as进行提交。这样一来,as就会非常芒,因为有100个客户与之连接。为了解决这个问题,delphi提出了"切断记录集"的概念。"切断记录集"充许前台先把数据取过来,接着充许你切断与as的连接,前台计算机依旧可以正常运行而不受影响,当你需要把前台在末连上as这段时间来所有变动数据写回数据库时,你只需要再连上as,然后下达写入命令。如此一来,将大大减轻as的负担.而负责此项功能的就是tclientdatae组件里面的"单机控制"功能。tclientdataset会把从as所传来的dataset临时保存为一个*.cds文件,tclientdataset就是通过midas.dll来访问这个临时保存的数据集*.cds文件。当你再把tclientdataset连上as时,你就可以把断线后所有的变动数据通过applyupdate方法写回数据库服务器.特别需要说明的是applyudate方法可以在前台与as断开的情况下把数据进行提交给as,原因在于applyupdate方法不仅可以把数据进行提交,更重要的是,它还可以判断在提交的时候前台与as是否连接,如果没有连接则它会先进行连接之后再提交.

    

 

相关新闻

肢体语言塑造你自己
总结
致谢
总结
刘小明-班组现场安全与作业管理培训总结
每一个程序员要遵守的一些优秀编程风格
杂谈语言(之六)——文字改革(下):一失足成千古恨的文字改革
杂谈语言(之五)——文字改革(上):半吊子的改革最糟糕!
杂谈语言(之四)——续谈广东话的口头语(2)
杂谈语言(之四)——续谈广东话的口头语(1)

您可能对这些感兴趣  

第7讲 综合分析BIM在运用与推广中的障碍问题
考核学生质量的困难
日本福岛核电站事故初步分析
论科技异化与科技人化
中国科技计划项目管理现状与对策
财政科技资金的审计重点和内容
软科学研究机构在政府决策中的功效、困境及对策研究
打造超级DOS系统(下)
DOS命令基础应用(6)
打造超级DOS系统(上)

题目筛选器
日期:
类型:
状态:
得分: <=
分类:
作者:
职业:
关键字:
搜索

 
 
 
  焦点事件
 
  知识体系
 
  职业列表
 
 
  最热文章
 
 
  最多引用文章
 
 
  最新文章
 
 
 
 
网站介绍 | 广告服务 | 招聘信息 | 保护隐私权 | 免责条款 | 法律顾问 | 意见反馈
版权所有 不得转载
沪ICP备 10203777 号 联系电话:021-54428255
  帮助提示    
《我的太学》是一种全新的应用,您在操作中遇到疑问或者问题,请拨打电话13564659895,15921448526。
《我的太学》