天天看點

DELPHi分布式多層設計,的瘦客戶機的了解

http://zhidao.baidu.com/question/33413238.html

本人用delphi+Interbase做過一個商用軟體《建築工地材料管理系統》已經4年了。我使用的是 c/s結構。

以下是本人在網上收集的delphi程式設計技巧材料的第三章内容(共10章,原編寫的章節就是第三章,她對我來說,起了很大作用,請參考指教。)

第三章 建立多層應用程式

  一個多層的Client/Server應用程式在邏輯上劃分為幾個部分,分别在不同的機器上運作,這些機器既可以在一個區域網路内,也可以在Internet上。多層體系結構最大的優勢可以概括為兩點,一是集中化的商業邏輯,另一個是客戶程式可以做得很“瘦”。

  目前較常見的是三層的體系結構,其中,最關鍵的是應用伺服器,它在三層體系結構中起了承上啟下的作用,是以,應用伺服器又叫Data Broker。Delphi4可以建立應用伺服器,也可以建立“瘦”客戶。如果不怕麻煩的話,也可以建立資料庫後端。

  在更複雜的多層體系結構中,“瘦”客戶與遠端伺服器之間可以加入更多的服務中間件,例如,可以加入一個安全服務中間件,或者加入一個轉換中間件,專門用來處理不同平台共享資料的問題。一旦您真正了解了三層的體系結構,多層的體系結構就迎刃而解。

3.1 多層體系結構的概述

  Delphi 4對多層體系結構的支援主要得益于它的MIDAS技術。MIDAS是Multi-tier Distributed Application Services Suite的簡稱。MIDAS技術與Delphi 4中的另一個關鍵技術DAX配合起來使用,可以使多層的體系結構分布在Intrenet/Intranet上。

3.1.1 多層體系結構的優勢

  在多層體系結構中,由于伺服器集中實作了應用邏輯(又稱商業規則),客戶程式可以把重點放在顯示資料和與使用者互動上,客戶程式甚至都不需要知道資料存儲在哪兒。

  具體來說,多層的體系結構具有如下優勢:

  在一個共享的中間層封裝了商業規則。不同的客戶程式可以共享同一個中間層,而不必由每個客戶程式單獨實作商業規則。

  客戶程式可以做得很“瘦”。因為很多複雜的工作由應用伺服器代勞了,客戶程式隻需要關注使用者界面本身。“瘦”客戶程式更容易釋出、安裝、配置和維護。

  實作了分布式資料處理。把一個應用程式分布在幾個機器上運作,可以提高應用程式的性能,通過備援配置還可以保證不會因為局部故障導緻整個應用程式崩潰。

  有利于安全。可以把一些敏感的功能放在有嚴密防護措施的層上,同時又不至于使使用者界面變得複雜。Delphi 4中的CORBA或MTS支援較複雜的安全機制。

3.1.2 MIDAS技術

  MIDAS技術是多層體系結構的關鍵。無論是應用伺服器端還是用戶端,MIDAS技術需要有DBCLIENT.DLL的支援,這個動态連結庫用于管理資料包。釋出MIDAS應用程式時需要購買伺服器許可。

  基于MIDAS的多層應用程式需要用到一些特殊的構件,這些構件分為四大種類:對象庫中的遠端資料子產品。遠端資料子產品與普通的資料子產品有些相似,不同的是,遠端資料子產品可以作為COM伺服器或CORBA伺服器讓客戶程式通路它的接口。

  TDataSetProvider和TProvider構件。這兩個構件用在應用伺服器端,主要作用是提供IProvider接口,客戶程式通過IProvider接口獲得資料和更新資料集。

  TClientDataSet構件。這是一個從TDataset繼承下來的但不需要BDE的構件。MIDAS連接配接構件。包括TDCOMConnection、TSocketConnection、TCorbaConnection TOLEnterpriseConnection、TMIDASConnection和TRemoteServer。其中,TMIDASConnection和TRemoteServer是為了相容Delphi3的代碼而保留的。MIDAS連接配接構件的作用是為客戶程式定位伺服器和IProvider接口。每個MIDAS連接配接構件都以一種特定的通訊協定工作。

3.1.3 MIDAS應用程式是怎樣工作的

  使用者首先要啟動客戶程式,客戶程式将試圖連接配接應用伺服器,如果應用伺服器還沒有運作,客戶程式将激活應用伺服器,并從中獲得IProvider接口。

  客戶程式向應用伺服器請求資料。如果TClientDataSet的FetchOnDemand屬性設為True,客戶程式會根據需要自動檢索附加的資料包如BLOB字段的值或嵌套表的内容。否則,客戶程式需要顯式地調用GetNextPacket才能獲得這些附加的資料包。

  應用伺服器收到客戶程式的請求後,就從遠端資料庫伺服器那兒檢索資料,并打包傳回給客戶程式

  客戶程式收到資料包後把包打開,然後顯示或進行處理。

  使用者對資料進行編輯修改,然後向應用伺服器申請更新資料,實際上也要打包。

  應用伺服器收到客戶程式的申請後,就向遠端資料庫伺服器申請更新資料。如果出錯,應用伺服器就把出錯的記錄傳回給客戶程式去核對。

  客戶程式核對并修改了資料後,既可以放棄此次更新,也可以繼續此次更新。

3.1.4 客戶程式的結構

  對于最終使用者來說,多層體系結構中的客戶程式與兩層體系結構中的應用程式沒有什麼差別,在結構上,客戶程式就好像一個基于檔案的單層應用程式一樣,仍然通過标準的資料控件與使用者互動。但與單層應用程式不同的是,多層體系結構中的客戶程式是通過應用伺服器提供的IProvider接口獲得資料的,也通過IProvider接口申請更新資料。

  注意:當使用MTS的時候,可以選擇不使用IProvider接口。不使用IProvider接口的好處是,可以充分發揮MTS在處理事務方面的特長。

  在客戶程式中,MIDAS連接配接構件扮演着極其重要的角色。不同的MIDAS連接配接構件使用不同的通訊協定:

. TDCOMConnection DCOM

. TSocketConnection Windows Sockets (TCP/IP)l

. TOLEnterpriseConnection OLEnterprise (RPCs)

. TCorbaConnection CORBA (IIOP)

  TRemoteServer和TMIDASConnection是為了相容Delphi 3的代碼而保留的。

3.1.5 應用伺服器的結構

  應用伺服器的關鍵部件是遠端資料子產品,它提供了IDataBroker接口。當客戶程式與應用伺服器建立了連接配接,就通過IDataBroker接口來獲得IProvider接口。

  Delphi 4支援三種類型的遠端資料子產品:

  TremoteDataModule。這是一個支援雙重接口的自動化伺服器,這種類型的遠端資料子產品适合于使用DCOM、TCP/IP或OLEnterprise方式。

  TMTSDataModule。這也是一個支援雙重接口的自動化伺服器,用這種類型的遠端資料子產品建立的應用伺服器是Active Library即動态連結庫,适合于使用DCOM、TCP/IP或OLEnterprise方式。

  TcorbaDataModule。這是CORBA伺服器,适用于與CORBA客戶通訊。

  上述三種遠端資料子產品都可以作為容器,但隻能放置非可視的構件。另外,遠端資料子產品上一般要放一個或幾個TDataSetProvider或TProvider構件來提供IProvider接口 。

  遠端資料子產品上也可以放TDatabase構件和TSession構件。

3.1.6 MTS

  MTS是Microsoft Transaction Server的簡稱,是Microsoft為分布式環境下進行事務處理所設計的服務接口。使用TMTSDataModule類型的遠端資料子產品的優勢是:

  MTS為應用伺服器提供了基于角色的安全機制。每個客戶都扮演着一種角色,決定了他們能否通路遠端資料子產品的接口。TMTSDataModule有一個函數叫IsCallerInRole,可以用來檢查客戶的角色,然後有條件地開放該角色所允許的功能。

  MTS提供了緩沖池的功能,它能把與資料庫的連接配接放到池中,當一個客戶不再需要連接配接時,另一個客戶可以繼續使用它,這樣,應用伺服器不必再次登入到遠端資料庫伺服器。可能有的讀者會想到,這個功能非常類似于TDatabase構件的KeepConnection屬性。不過,要注意的是,如果用了TDatabase構件的話,KeepConnection屬性最好設為False。

  MTS提供了強大的事務處理能力,它的“兩階段送出”技術使得應用程式能夠跨伺服器處理事務。

  可以用TMTSDataModule類型的遠端資料子產品實作一個MTS伺服器,這個MTS伺服器能夠根據需要自動地激活或相反,換句話說,隻有當遠端資料子產品接收到客戶的連接配接請求時才建立子產品的一個執行個體,這樣能夠最大程度地節省資源。

  由此可見,MTS伺服器可以有兩種工作方式,一是單執行個體方式,一個執行個體能夠處理多個客戶的請求,不過,如果客戶較多的話,遠端資料子產品就成了瓶頸,制約着應用伺服器的性能。二是多執行個體方式,每個客戶請求連接配接時都會建立遠端資料子產品的一個執行個體,這樣,幾個客戶就可以同時通路資料庫而不需要排隊。

  為了發揮MTS的上述優勢,遠端資料子產品的執行個體必須做到與狀态無關,而IProvider接口又依賴于狀态資訊,這就造成沖突。是以,TMTSDataModule類型的遠端資料子產品往往不用IProvider接口,而是自己建立一個接口來傳遞資料和申請更新。

  注意:使用MTS的時候,在遠端資料子產品的執行個體激活之前不能連接配接資料庫。

3.1.7 IDataBroker接口和IProvider接口

  應用伺服器上的遠端資料子產品支援IDataBroker接口,當客戶程式與應用伺服器連接配接以後,客戶程式上的MIDAS連接配接構件就查找IDataBroker接口。

  IDataBroker接口隻實作了一個方法叫GetProviderNames,調用這個方法可以獲得一個清單,這個清單列出了應用伺服器上的TDataSetProvider和TProvider構件。

  TClientDataSet的ProviderName屬性可以指定其中一個TDataSetProvider或TProvider構件。當客戶程式通過IDataBroker接口的GetProviderNames以及TClientDataSet的ProviderName屬性指定了應用伺服器上的一個TDataSetProvider或TProvider構件後,隻要客戶還在引用IProvider接口,遠端資料子產品的狀态就應該保持,這與MTS的許多特點是有沖突的,也會與單執行個體的CORBA伺服器發生沖突。

  客戶程式與應用伺服器之間通過IProvider接口交換資料,不過,大部分客戶程式并不直接使用IProvider接口,而是通過TClientDataSet的屬性和方法間接地使用IProvider接口。 不過,也可以通過Provider屬性獲得IProvider接口,然後直接通路IProvider接口。

  下面這個表列出了IProvider接口的屬性和方法,同時列出了TProvider構件以及TClientDataSet構件中與之對應的屬性和方法。

IProvider TProvider TClientDataset

ApplyUpdates ApplyUpdates ApplyUpdates

Constraints屬性 Constraints 客戶程式隻能通過IProvider接口通路這個屬性

Data Data Data

DataRequest DataRequest 客戶程式隻能通過IProvider接口通路這個方法

Get_Constraints Constraints 客戶程式隻能通過IProvider接口通路這個方法

Get_Data Get_Data 用于實作Data屬性

GetMetaData GetRecords(Count = 0) 内部使用

GetRecords GetRecords 用于GetNextPacketResetReset内部使用

Set_Constraints Constraints 客戶程式隻能通過IProvider接口通路這個屬性

SetParams SetParams 用于Params屬性

注意:IProvider接口的許多屬性和方法依賴于遠端資料子產品的狀态資訊,正因為如此,在使用CORBA或MTS的應用程式中一般不要用IProvider接口。

3.2 選擇連接配接方式

  在客戶程式與應用伺服器之間,Delphi 4提供了四種不同類型的連接配接方式或者說通訊協定,包括DCOM、TCP/IP、OLEnterprise和CORBA。這些不同的連接配接方式都各有利弊,到底選擇哪種連接配接方式,取決于客戶的數量、客戶的分布情況以及怎樣釋出應用程式。

  DCOM是一種最直接的連接配接方式,它不需要專門的運作期軟體支援。不過,Windows 95 不支援DCOM,除非安裝了DCOM95程式。

  要使用MTS安全服務,最好使用DCOM連接配接方式。MTS的安全服務是基于角色的,當一個客戶通過DCOM通路MTS時,DCOM會告訴MTS有關客戶的資訊,MTS據此來決定客戶的角色。如果用其他連接配接方式,需要有專門的運作期軟體支援,客戶的調用首先被傳遞給這些運作期軟體而不是MTS,MTS就不能盡快指派角色。

  TCP/IP連接配接方式的适合範圍非常廣泛,例如,如果客戶程式要以ActiveForm的形式分布在Web上,最好采用TCP/IP連接配接方式,因為您無法肯定下載下傳ActiveForm的計算機是否支援DCOM,而支援TCP/IP的環境是很普遍的。

  要使用TCP/IP連接配接方式,應用伺服器端必須運作一個專門的運作期軟體ScktSrver.exe或ScktSrvc.exe,其中,ScktSrvc.exe隻适合于Windows NT,可以作為一個服務在背景運作。與DCOM連接配接方式不同的是,客戶的請求首先傳遞給ScktSrver.exe或ScktSrvc.exe,然後再建立遠端資料子產品的執行個體,而不是由客戶的調用直接建立遠端資料子產品的執行個體。客戶程式上的MIDAS連接配接構件通過IProvider接口與ScktSrvr.exe or ScktSrvc.exe通訊。

  不過,客戶程式很有可能在沒有正常釋放對IProvider 接口的引用之前出現異常,而TCP/IP連接配接方式無法檢測到這種情況,更無法通知應用伺服器,是以,有可能造成應用伺服器上的資源被占用後得不到釋放的後果。

  如果要在應用伺服器端使用Business Object Broker,就要使用OLEnterprise連接配接方式。此時,應用伺服器端和用戶端都要安裝OLEnterprise運作期軟體。

  Delphi 4是目前唯一支援CORBA的開發工具。基于CORBA的客戶程式和應用伺服器可以與其他基于CORBA的應用程式無縫對接。要使用CORBA連接配接方式,需要ORB的支援,它提供了類似于Business Object Broker的功能。

3.3 建立應用伺服器的一般步驟

  要建立一個多層Client/Server應用程式,首先要建立應用伺服器,然後注冊或安裝應用伺服器,隻有應用伺服器已注冊并且正在運作的情況下,才能建立客戶程式。對于客戶程式來說,既可以在設計期連接配接應用伺服器,也可以在運作期連接配接應用伺服器。

  注意:如果客戶程式與應用伺服器不在同一個系統中,必須在客戶計算機上注冊或安裝應用伺服器,這樣,在設計期就可以連接配接應用伺服器。

  建立一個應用伺服器與建立一個兩層的資料庫應用程式有些相似,主要的差別是,應用伺服器需要提供IProvider接口,這一般是通過TDataSetProvider或TProvider構件提供的,也可以通過資料集構件如TTable的Provider屬性提供。建立應用伺服器的一般步驟是:

  第一步是使用"File"菜單上的"New Application"指令開始一個新項目,然後使用File菜單上的New指令,選取Multi頁,如圖3.1所示。

  選擇一個遠端資料子產品。如果要建立一個COM自動化伺服器,允許客戶通過DCOM、TCP/IP、OLEnterprise等方式通路此伺服器,選擇RemoteMod。如果要建立一個允許客戶通過MTS通路的Active Library,選擇MTSData Module。如果要建立一個CORBA伺服器,選擇Corba Data。

  第二步是把一個資料集構件如TTable、TQuery或TStoredProc放到遠端資料子產品上,并進行有關設定,使得它們能通路遠端的SQL資料庫。盡量不要把TDatabase構件放到遠端資料子產品上,因為這可能引起名稱沖突。如果實在要用TDatabase構件來連接配接SQL資料庫,建議把TDatabase構件放到另一個資料子產品上,然後引用這個資料子產品的單元檔案。

  第三步是把TDataSetProvider或TProvider構件放到遠端資料子產品上,有一個資料集構件,就要有一個TDataSetProvider或TProvider構件與之對應。然後,用滑鼠右鍵單擊TDataSetProvider或TProvider構件,在彈出的菜單中選擇ExportFrom <Name> in Data Module指令,這是為了引出Provider接口,在類型庫中注冊。

  第四步是設定TDataSetProvider或TProvider構件的DataSet屬性指定要通路的資料庫,實際上就是第二步所放的資料集構件。

  第五步是編寫代碼,實作商業規則。當然,這一步遠遠不是幾句話所能說清楚的。

  第六步是儲存、編譯、注冊或安裝應用伺服器。

  如果使用DCOM、TCP/IP、OLEnterprise作為通訊協定,應用伺服器就好像一個自動化伺服器一樣,必須像ActiveX或COM伺服器那樣注冊。

  如果使用MTS,應用伺服器是DLL而不是EXE,這時候不需要注冊應用伺服器,而要把這個DLL作為MTS對象安裝到MTS包中。

  如果使用CORBA,可以不注冊但最好注冊。如果要使客戶程式對伺服器接口的調用在運作期是動态确定的,就要在接口庫(Interface Repository)中安裝伺服器的接口。如果要使客戶程式能自動激活應用伺服器(如果還沒有運作的話),應用伺服器就必須用OAD(Object Activation Daemon)注冊。

  第七步是如果應用伺服器沒有使用DCOM,您必須安裝有關的運作期軟體,因為其他連接配接方式需要這些運作期軟體的支援。例如,對于TCP/IP來說,需要安裝ScktSrvr.exe或ScktSrvc.exe,後者隻能運作在Windows NT環境下。對于OLEnterprise來說,需要安裝OLEnterprise運作期版本。對于CORBA來說,需要安裝VisiBroker ORB。

3.4 遠端資料子產品

  應用伺服器的關鍵部件是遠端資料子產品。Delphi 4支援三種類型的遠端資料子產品,分别是TRemoteDataModule、TMTSDataModule、TCorbaDataModule。

3.4.1 TRemoteDataModule

  要加入一個TRemoteDataModule類型的遠端資料子產品,使用“File”菜單上的“New”指令,選取“Multitier”頁,輕按兩下“Remote Data Module”圖示,彈出“Remote Data Module Wizard”對話框,如圖3.2所示。

  在“Class Name”框内鍵入遠端資料子產品的類名,不必以T打頭。Delphi 4将以此名生成一個TRemoteDataModule的派生類,并以此名生成有關接口。例如,假如在“Class Name”框内鍵入“MyDataServer”, 遠端資料子產品的類名就是TMyDataServer,它所實作的接口叫IMyDataServer,其祖先接口是IDataBroker。

  在“Threading Model”框内選擇一種線程模式。可以選“Single-threaded”、“Apartment-threaded”、“Free-threaded”或者“Both”。

  在“Instancing”框内選擇是否根據客戶的請求生成遠端資料子產品的多個執行個體,可以選“Single instance”或“Multiple instance”。

3.4.2 TMTSDataModule

  要加入一個TMTSDataModule類型的遠端資料子產品,使用“File”菜單上的“New”指令,選擇“Multitier”頁,輕按兩下“MTS Data Module”圖示,彈出“MTSData Module Wizard”對話框,如圖3.3所示。

  圖3.3 MTS Data Module對話框

  在“Class Name”框内鍵入遠端資料子產品的類名,不必以T打頭。Delphi 4将以此名生成一個TMTSDataModule的派生類,并以此名生成有關接口。例如, 假設在“Class Name”框内鍵入“MyDataServer”, 遠端資料子產品的類名就是TMyDataServer,它所實作的接口叫IMyDataServer,其祖先接口是IDataBroker。

  對于TMTSDataModule類型的遠端資料子產品來說,必須在“ThreadingModel”框内選擇一種線程模式。可以選“Single”、“Apartment”或者“Both”。在“Transaction Attributes”框内選擇事務屬性:

  如選擇“Requires a transaction”,每當客戶通路遠端資料子產品的接口時,都與目前的事務是相關的。客戶不可能在事務中再申請一個新的事務。

  如選擇“Requires a new transaction”,每當客戶通路遠端資料子產品的接口時,都自動開始一個新的事務。如選擇“Supports transactions”,遠端資料子產品可以用在事務的環境中,客戶通路遠端資料子產品的接口時必須申請一個新的事務。

  如選擇“Does not support transactions”,遠端資料子產品不能用在事務的環境中。

  注意:MTS對象隻能加入到ActiveX項目中,如果試圖在一個EXE項目中加入TMTSDataModule類型的遠端資料子產品,Delphi 4會顯示一個提示框,如圖3.4所示。

  圖3.4 一個提示框

3.4.3 TCORBADataModule

  要加入一個TCorbaDataModule類型的遠端資料子產品,使用“File”菜單上的“New”指令,選取“Multitier”頁,輕按兩下“CORBA Data Module”圖示,彈出“CORBA Data Module Wizard”對話框,如圖3.5所示。

  圖3.5 CORBA Data Module對話框

  在“Class Name”框内鍵入遠端資料子產品的類名,不必以T打頭。Delphi 4将以此名生成一個TCorbaDataModule的派生類,并以此名生成有關接口。例如,假設在“Class Name”框内鍵入“MyDataServer”, 遠端資料子產品的類名就是TMyDataServer,它所實作的接口叫IMyDataServer,其祖先接口是IDataBroker。

  在“Instancing”框内指定應用伺服器怎樣建立遠端資料子產品的執行個體,可以選“Shared Instance”或者“Instance-Per-Client”。

  如果選“Shared Instance”,應用伺服器隻建立遠端資料子產品的一個執行個體來處理所有客戶的請求,是以,遠端資料子產品必須與狀态無關,換句話說,就是不能使用IProvider接口。

  如果選“Instance-Per-Client”,每當一個客戶試圖連接配接時,遠端資料子產品都會生成一個執行個體。隻要客戶與應用伺服器的連接配接沒有斷開,遠端資料子產品的執行個體就一直存在。這種模式下,允許使用IProvider接口。唯一要考慮的問題是,客戶程式有可能意外終止,導緻沒有正常地斷開與應用伺服器的連接配接。應用伺服器為了避免不必要的資源浪費,可以定期地檢查客戶是否正在運作,如沒有,就手工把遠端資料子產品的執行個體删掉。

  在“Threading Model”框内選擇一種線程模式。可以選“Single-threaded”、“Multi-threaded”。

3.5 Provider

  遠端資料子產品上往往要放一個或幾個TDataSetProvider或TProvider構件,用于提供IProvider接口。有時候,也可以不顯式地使用TDataSetProvider或TProvider構件,而是由資料集構件如TTable、TQuery或TStoredProc的Provider屬性間接地提供IProvider接口。

  顯式地使用TDataSetProvider或TProvider構件的好處是,可以直接控制資料包中包含哪些資訊、應用伺服器怎樣響應客戶的請求。如果顯式地使用了TDataSetProvider或TProvider構件,必須設定他們的DataSet屬性指定要通路的資料集。

3.5.1 控制資料包中的字段

  要控制哪些字段包含到資料包中,首先要建立永久字段。以後,隻有永久字段才加入到資料包中。如果不建立永久字段的話,資料集中的所有字段都将加入到資料包中。

  如果建立的永久字段中包含計算字段,由于計算字段的值是在運作期計算出來的,這些字段雖然也能加入到資料包中,但這些字段傳遞到用戶端後就變成隻讀的。

  由于客戶程式很有可能要編輯修改資料,并且要把編輯修改後的資料申請更新到應用伺服器上,是以,您建立的永久字段的數量不能太少,否則,很有可能出現重複的記錄。舉例來說,假設有一個學生成績表,由學号、姓名、國文成績、數學成績、曆史成績等字段組成,如果建立的永久字段中隻包含國文成績、數學成績、曆史成績等字段,很有可能出現兩名學生的上述成績完全一樣,也就是說有重複的記錄,這是不允許的。

  如果實在不想使客戶程式看到某個字段,而如果沒有這個字段的話很有可能出現上述錯誤,這時候您可以讓這個字段(TField對象)的ProviderFlags屬性包含pfHidden元素,表示這個字段雖然加入到資料包中,但卻是隐含的,客戶看不到它。

  特别要注意的是,如果使用TQuery作為應用伺服器上的資料集構件,SQL語句應當選擇足夠多的字段,即使客戶程式并不需要這麼多字段,否則,就有可能出現上述錯誤。

3.5.2 Options屬性

  這個屬性是一個集合,用于設定有關打包和傳遞的選項。

  如果包含poFetchBlobsOnDemand元素,表示BLOB字段一般不放到包中,除非用戶端的TClientDataSet構件的FetchOnDemand屬性設為True或者顯式地調用FetchBlobs。

  如果包含poFetchDetailsOnDemand元素,表示嵌套表中的字段不放到包中,除非用戶端的TClientDataSet構件的FetchOnDemand屬性設為True或者顯式地調用FetchDetails。

  如果包含poIncFieldProps元素,表示把字段的屬性也放到包中,包括Alignment、MinValue、DisplayLabel、DisplayWidth、Visible、DisplayFormat、MaxValue、EditFormat、Currency、EditMask、DisplayValues等屬性。

  如果包含poCascadeDeletes元素,當父表中的某條記錄被删除時就把子表中的相應記錄也删除。

  如果包含poCascadeUpdates元素,當父表的關鍵字段的值變化時自動更新子表的記錄。

  如果包含poReadOnly元素,表示不允許“瘦”客戶向TDataSetProvider申請更新資料。

3.5.3 在資料包中加入自定義的資訊

  當用戶端通過IProvider 接口調用DataRequest函數請求資料時将在應用伺服器端觸發OnGetDataSetPropertiesevent事件,這樣,應用伺服器就有機會在資料包中加入一些自定義的資訊。用戶端可以調用GetOptionalParam來檢索這些資訊。

  OnGetDataSetPropertiesevent事件是這樣聲明的:

  TGetDSProps = Procedure(Sender: TObject; DataSet: TDataSet; out Properties:OleVariant);

  其中,Properties參數是一個可變類型的數組,用于指定要加入的資訊。Properties參數的每個元素由三部分組成:名稱、值和一個布爾數。Delphi 4定義了幾個标準的資訊名稱,它們是UNIQUE_KEY、DEFAULT_ORDER、CHANGE_LOG、SERVER_COL、CONSTRAINTS、DATASET_CONTEXT、DATASET_DELTA、LCID、BDERECORD_X、TABLE_NAME、MD_FIELDLINKS、UPDATEMODE。程式示例如下:

Procedure TAppServer.Provider1GetDataSetProperties(Sender: TObject; DataSet: TDataSet; out Properties:OleVariant);

Begin

  Properties := VarArrayCreate([0,1], varVariant);

  Properties[0] := VarArrayOf(['TimeProvided', Now, True]);

  Properties[1] := VarArrayOf(['TableSize', DataSet.RecordCount, False]);

End;

  上面這個程式中,加入了兩個自定義的資訊,一個叫TimeProvided,它的值是目前的日期和時間,True表示這個資訊可以由用戶端傳回給應用伺服器。另一個資訊叫TableSize,它的值是資料集的記錄數,False表示這個資訊不可以由用戶端傳回給應用伺服器。

  以後,當用戶端申請更新資料時,TDataSetProvider的OnUpdateData事件可以讀出資料包中的資訊。程式示例如下:

Procedure TAppServer.Provider1Updat

繼續閱讀