发信人: skyice() 
整理人: skyice(1999-12-30 01:17:58), 站内信件
 | 
 
 
7.3客户应用程序
   总的来说,前面作的那些工作还是比较简单的.使客户应用程序能够运行应用
 服务程序和访问数据库的工作要复杂一些.最好在同一台计算机上设计应用服
 务程序和客户应用程序.所有一切都正常运行后,再把客户应用程序或应用服务
 程序移到他们所存放的计算机上.
   回到将现有应用程序项目转变为一个客户应用程序的话题上.因为我们已经
 在主窗体上删除了所有的Data Access(数据访问)组件,那么代码是不能进行
 编译的.
   首先,应该通过客户应用程序的TRemoteServer组件建立与应用服务程序之
 间的连接.
   TRemoteServer在多层数据库应用程序的客户程序中使用,用来建立和维护
 客户机与远程应用服务程序之间的连接.远程服务器对象可以:
   * 与远程应用服务程序相连.
   * 通过这个连接给出一个提供客户数据集的有关供应商名单列表.
   * 可以取得一个基于上面列表的IProvider接口.
   * 对通过这个连接进行服务的本地客户数据集列表进行维护.
   * 断开与远程应用服务程序之间的连接.
   远程服务器对象通过使用DCOM来建立客户应用程序与远程应用服务程序之间
 的初始连接.当建立这个连接后,客户机通过远程应用服务程序注册在客户集中
 的所有客户数据集,然后,这些客户数据集就可以通过他们的IProvider接口,直
 接与应用服务程序的TProvider对象进行通信.
   从组件选项版的Data Access页中选择RemoteServer组件,将她放置在主窗
 体中,并且把她命名为ObjBrwRS.在Object Inspector中,将Computer Name
 设置为当前计算机的名称.当需要查找应用服务程序时,客户应用程序就会查找
 这个计算机名.
   注释:
   如果想要重新设置应用服务程序的路径,那么就需要将Computer Name设置
 为新的应用服务程序所在的计算机名.同时,必须再次在新的计算机下设置DCOM
 工具.
   因为已经运行和注册了应用服务程序,所以使用Object Inspector是,在Re-
 moteServer的ServerName属性框的下拉列表中应该出现正确的类名.选择服务
 程序后,会在ServerGUID属性框中自动的填写ID值.GUID是用来表示对象的全
 程标识符.
   现在,我们就来检测一下这个连接.将Connected属性设置为Ture(或者将他
 保留为True)后,应该可以启动应用服务程序.
   注释:
   这时,如果所用的表的数据没有出现在DBGrid组件中,也不必担心.
   这并不意味着数据库没有正确的连接,只不过是C++Builder的一个特征.
   在客户程序中没有必要创建TDatabase组件,因为应用服务程序会处理这一
 切.所有与TDatabase组件(ClassOrgDB)有关的代码会被删除.
   下面将使用的不是TTable组件,而是TClientDataSet组件.TClientData-
 Set组件封装了一个与数据库无关的分布式数据集.客户数据集(非鱼注:此处
 应为ClientDataSet,即指TClientDataSet组件,"客户数据集"是翻译上的错
 误.但原书上即如此,为忠实于原著,故不作更改,此注为便于大家理解)可以用
 来作为:
   * 单层数据库应用程序中简单的,功能完整的,平面文件数据集.客户数据集
     (注:同上)这样使用时,应用程序就可以通过客户数据集直接对用户的硬盘
     进行读写操作,而不需要访问BDE.
   * 多层数据库应用程序的客户应用程序中的客户数据集.
   注释:
   也可以通过使用briefcase模式,使多层应用程序支持数据的离线使用.
   在网络中,应用程序通过TClientDataSet与向应用服务程序提供数据的计算
 机进行通信.当某个用户退出网络时,客户数据集就在硬盘上写入数据的一个快
 照.
   应用程序可以离线使用这个数据快照,这时,客户数据集就作为单层应用程序
 中的平面文件数据集.
   客户数据集一般通过一个IProvider双向接口与提供数据的计算机进行通信.
 在单层模式和briefcase模式中,客户数据集中的Provider接口是自动生成的.
 在客户应用程序作为多层应用程序的一部分时,客户数据集得Provider通常是
 作为应用服务程序的一部分的TProvider对象.从组件选项版的Data Access页
 中选取几个ClientDataSet组件,并且给这些组件做上标签.
   在Object Inspector中可以注意到,ClientDataSet属性有点类似与TTable
 属性,只是DataBaseName和TableName属性已经有RemoteServer和Provider-
 Name属性所代替.
   将RemoteServer属性设置为ObjBrwRS,并且将ClientDataSet对象的Prov-
 iderName设置为所用的表名.应该可以在ProviderName下拉列表中看到所有的
 表.这些表来自于服务程序,显示这些表就说明连接正常.如果没有显示这些表,
 那么可能在设计应用服务程序时忘记了把他们输出.
   接下来,把ClientDataSet的Active属性设置为True.如果这些步骤都成功了,
 那么就已经完成了各个层之间的连接.在主窗体中放置一个DataSource(Main-
 DS)组件,并且将她与表相连,然后再把主窗体上的Grid对象的DataSource属性
 设置为MainDS.应该可以在主窗体上的Grid中看到表的内容.通过应用服务程
 序,客户应用程序可以在脱离SQL数据库服务器的环境下访问表.
 
 
 ——原文由ifeelyou发表
  -- 子非鱼,安知鱼之乐?
 子非我,安知我不知鱼之乐?
 Please let me feel you!
  ※ 修改:.skyice 于 Dec 30 00:46:19 修改本文.[FROM: 202.99.82.228] ※ 来源:.月光软件站 http://www.moon-soft.com.[FROM: 202.103.137.225]
  | 
 
 
 |