呵呵,我也想要。不过,我抄了李维的《delphi5分布多层系统篇》了。里头多的是。
要书的话,网上多的是ebook。
http://www.mycnknow.com/

解决方案 »

  1.   

    本人一部分笔记《delphi5分布多层系统篇》
    --------------------------------------------
    在D5中,软件开发人员可终于不编写任何特别的程序代码就可以直接开发出无状态对象(Stateless Object),这有别于D4的有状态对象(State Object)。
    为什么D5中要分有状态中介对象和无状态中介对象。
    D5的远程资料模块在内定上便是一个无状态对象,所以它可以立刻的跟MTS结合。或是使用在Internet/Intranet/电子商务系统中提高延展性的服务。
    MIDAS是一般有用途的中介软件,它主要是让D的应用系统能够拥有负载平衡和容错能力的功能,而MTS则是注重在数据库的交易控制能力。
    page25
    开发多层应用系统
    在多层应用系统中更新数据
    在多层应用系统中查询数据
    在多层应用系统中存取数据
    开发多层应用系统,程序员必须遵循下面的开发步骤:
    1.开发远程服务器,这个应用程序服务器负责提供数据或是服务给客户端应用程序使用。
    2.开发客户端应用程序界面,客户端应用程序会向第一个步骤建立的应用程序提出要求。
    3.连接客户端和应用服务器。D5提供建立远程应用程序服务器的能力必须是一个EXE类型的服务器,它称为MIDAS服务器。这是和使用MTS建立的应用程序服务器不一样的。
    开发服务器的步骤:
    1.建立应用程序
    2.建立远程数据模块
    3.在远程数据模块中使用数据集组件连接远程数据库
    4.使用TDataSetProvider组件连接远程数据模块中的数据集组件
    5.注册应用程序(如果使用DCOM通讯协议的话)
    在使用Delphi开发多层式应用系统时,最重要的工作便是应用程序服务器。因为应用程序服务器提供了客户端应用程序存取远程数据库的接口。也可以让程序员编写应用逻辑组件在应用程序服务器让所有的客户端程序调用使用。D使用分布式VCL组件建立的应用程序服务器基本上是一个OLE Automation 服务器。
    Remote Data Module 
    在D产生了远程数据模块之后,程序员就可以在这个数据模块中加入任何非可视化的VCL组件,例如:TDatabase,TQuery组件等连结到后端的数据库。
    使用数据集组件连结到远程数据库:应用程序服务器提供客户端存取远程数据库的能力是其主要的功能之一。但是要让客户端能够通过应用程序服务器存取远程数据,首先应用程序服务器必须先连结到远程数据库,然后再让客户端应用程序连结应用程序服务器存取这些数据。
    DATABASE AliasName- HandleShared:True; Connected:true; name:SQL Builder 
    使用TDataSetProvider组件:在应用程序服务器成功的从远程数据库取得数据之后,它必须提供一个方式让客户端应用程序可以和它沟通。TDataSetProvider可以连结到远程数据模块之中的数据集组件,然后就可以让客户端应用程序连接到此TDataSetProvider,再存取数据集组件连结的数据表数据。
    DataSetBroker DataSetBroker DataSetBroker DataSetProvider
    在D5中,应用程序服务器是无状态对象,因此不需要输出IProvider接口,在D5中已经以IAppServer来代替IProvider接口。由于IAppServer中没有任何的属性,所以在内定上它是一个无状态接口,不会为客户端应用程序存储任何的状态信息。
    注册服务器应用程序:在这个应用程序服务器可以被使用之前,必须完成最后一个步骤,那就是注册这个应用程序服务器让COM系统可以自动的激活这个应用程序服务器。
    当第一次执行应用程序服务器注册之后,它会在window的系统注册器中登录应用程序服务器的重要信息,这些信息可以让COM/DCOM在客户端要求连结应用程序服务器时自动的激活这个应用程序服务器。
    开发客户端应用程序:组件是TClientDataSet.
    开发客户端应用程序,步骤如下:
    建立一个新的Delphi应用程序:
    Project Group建立一个新的项目组 
    建立一个新的数据模块:
    TDCOMConnection
      ComputerName 和 ServerName
    TClientDataSet组件:
      RemoteServer属性 ProviderName属性
      Packetrecord   -1 (代表依次要从应用程序服务器得到多少数据)
    &&& HandleShared:true 一定要记住
    Delphi的多层应用系统对于更新数据的设计理念便是把更新的数据暂时存储在客户端应用程序之中,只有程序员真正决定把数据更新回后段的数据库时,必须再调用应用程序提供的一个方法才会把更新的数据真正的更新回数据库之中。
    学习到41页 搜寻数据
    function Locate(const KeyFields:String;const KeyValues:Variant;Options:TLocateOption):Boolean;override;
      它接受三个参数,第一个参数代表要搜寻的字段,第二个参数代表搜寻的键值,最后一个参数代表如何根据键值搜寻数据。例如要搜寻所有李维写的Delphi书籍,那么可以使用如下的程序代码:
     cdsBooks.Locate('Author;BookType',VarArrayOf(['李维','Delphi']),[loCaseInsensitive,loPartialKey]);
    locate方法允许程序员使用数个字段来搜寻数据,而且这些字段可以不是数据表的索引字段。
    DataModule1.ClientDataSet1.Locate('Category',VarArrayOf([edtSearch.Text]),[loCaseInsensitive,loPartialKey]);
    那就是如果使用TClientDataSet的Locate方法搜索数据时,TClientDataSet组件会先把数据表中所有数据中所有的数据下载到客户端应用程序中再进行搜寻的动作。
      从前面的范例中可以知道在客户端应用程序的TClientDataSet必须通过DCOMConnection,SocketConnection连结到应用程序服务器之中特定的DataSetProvider来存取数据,例如通过TQuery使用SQL叙述来存取数据。
      在D5中对于TClientDataSet做了改善,它允许程序员直接在客户端应用程序中使用SQL叙述动态的存取数据,或是对应用程序服务器下达特定的命令。
    最后一个重要的步骤便是设定dspGeneral的Options属性值中的poAllowCommandText属性值为true. poAllowCommandText属性值  poAllowCommandText属性值ADOConnction name:adocSQL
    TADOQuery name:
    TDataSetProvider name:dspGeneral
    page 46
    51
    在执行这个范例之前,在应用程序服务器之中必须先执行Delphi5\bin\目录下的ScktSrvr.exe这个程序,因为这个范例是使用socketConnction连接应用程序服务器的,因此应用程序服务器机器必须先执行这个Socket Server应用程序,否则.......
    TClientDataSet 的RemoteServer的属性设置
    "run"按钮的OnClick会根据目前在PageControl中作用中的页次来决定执行什么SQL叙述,当组合了正确的SQL叙述之后,便把这个SQL叙述放到TClientDataSet的CommandText属性值中。最后再开启TClientDataSet组件,这个SQL叙述执行的结果会回传到TClientDataSet之中。如果你使用的SQL叙述不回传任何的Cursor,那么你必须调用ClientDataSet的Execute方法,而不是调用open。 
    使用参数动态存取远程数据:
    多层应用系统是先在应用程序服务器的远程数据模块之中定义好了要存取的数据来源之后,然后把这些是数据传送到客户端让用户处理。
    动态SQL叙述 Delphi的SetRange 过滤器功能 
    远程数据模块SetParamDemo TQuery
    select * from events where Event_Date>=:Start_Date and
                               Event_Date<=:End_Date
    order by Event_Date
    ClientDataSet 右键 Fetech Params选项 这个选项就可以从ClientDataSet连结的DataSetProvider中得到TQuery组件SQL叙述中的动态参数。
    Params:
    0 -Start_Date
    1 -End_Date
    -------------------------------
    Events.close;
    Events.Params.ParamByName('Start_Date').AsDateTime:=StrToDateTime(StartDate.Text);
    Events.Params.ParamByName('End_Date').AsDateTime:=StrToDateTime(EndDate.Text);
    Events.open;
    -----
    SetRangeStart 和 SetRangeEnd 来过滤客户端应用程序需要的数据。可惜的是,使用TTable动态选择数据只适用于选择有索引的字段
    Page 58
    使用Delphi编写Master/Detail的应用程序有许多的方式,例如使用两个TTables,两个TQuery,或是使用Cached Updates。虽然这些方式都可以让程序员编写Master/Detail的应用程序。
      所谓的巢状数据表的意思是当Delphi的数据封包在数据时,这个数据封包甚至能够把一个数据集封装起来。所以程序员可以在应用程序服务器的远程数据模块中使用两个TTable组件或是 TQuery组件先建立Master/Detail的关联。然后使用TDataSetProvider组件把主数据集输出到客户端。那么当客户端应用程序从应用程序服务器取得数据时,应用程序服务器也会把主数据集相关的子数据集的数据也封装在数据封包之中并且传输到客户端。当包含子数据集的数据封包到达客户之后,ClientDataSet会负责主数据集和子数据集之间数据互动的关系,而不需要程序员自己编写程序代码来处理。简单地说就是ClientDataSet和DataSetProvider组件已经帮程序员写好了处理Master/Detail数据关系的程序代码。
      

  2.   

    谢谢各位!
    to wjohenw(天奇) 
    能不能贴点出来,你们公司有我怎么看的到啊!