       14 

       

      
    
      ClientDataSet 

    ,      clientDataSets. 

    I  Provider 

         Providers    
   ClientDataSets. 

      RemoteServer 

       RemoteServers    
ClientDataSets      Providers   .; 

      , OLE, Intemet/intranet    
        Windows. 
       
      .  Delphi  
  ,         
  ,       
       . 

     ClientDataSet, Providers  RemoteServers 

          : 
   ,     DBMS.   
   ,     . ( 
   ,         DBMS?) 
        .  
   ,  Delphi 3    
ClientDataSet. . ,    Delphi   
 ,  ,    ,    
      Borland Database Engine 
(BDE).       BDE ,   
 ,  

    331 

      ClientDataSet.    BDE   
  DLL DBCIENT. DLL,     
,   ClientDataSet.    DLL 
  - IDSBase  IDSCursor. (  
,    ,    -.) 
    4) IProvider     
    .  ,  
ClientDataSet          
  ,     .    
        . 
     ClientDataSet     
DataSet.     ClientDataSet   
     "",  Table.  
,   - ,     
   ClientDataSet.  ,  ClientDataSet 
           , 
   Table.   ClientDataSet   
,    ,   ,  , 
  ,  ,  KaKAddIndex  Locate,   Filter 
 Filtered  .   ClientDataSet   
  void    .     
  .       
IProvider,    .    
   IProvider,    
.   ,     
RemoteServer,     .   
   ClientDataSet   ,  
    RemoteServer    . 
        ,     
"--",    CachedUpdates.  
, ClientDataSet,       
.    ClientDataSet   , 
 Delta,     Provider   
,         
Table  Query.      ,    
    OLE Automation.    
  ,   Automation    
COM/DCOM.        OLE,  
           , 
  .  ,  , ,   
      . 

          

      RemoteServer    ,  
  ,     
 ClientDataSet  Provider. 

    TRemoteServer = class(TCustomRemoteServer) 
    public 
    function GetProvider(const ProviderName: string): IProvider; override; 
    published 
    property ComputerName: string ... ; 
    property Connected: Boolean ... ; 
    property ServerName: string ...; 
    Beforeproperty AfteDisconnect: TNotifyEvent ...; 
    end; 

       RemoteServer   ,   
 , ,   .  ServerName,  
   ,    .  
      OLE Automation, 
     Provider,   
GetProvider.      , ProviderName, 
    OLE Automation,   IProvider. 
     ,  RemoteServer    , 
OnConnect  OnDisconnect,      
   . 

    332                                      III.     


      ClientDataSet 

      ,  ClientDataSet  ,  
  .    ()   
Table  Query    .   ,   
 IProvider,       .  
  14.1    STDVCL. , ,   
  IProvider. 

     14.1. STDVCL. PAS.   IProvider                 

    IProvider = interface(IDispatch) 
    function Get_Data: OleVariant; safecall; 
    function ApplyUpdates(Delta: OleVariant; MaxErrors: Integer; 
    out ErrorCount: Integer): OleVariant; safecall; 
    function GetMetaData: OleVariant; safecall; 
    function GetRecords(Count: Integer; out RecsOut: Integer): 
    OleVariant; safecall; 
    function DataRequest(Input: OleVariant): OleVariant; safecall; 
    function Get_Constraints: WordBool; safecall; 
    procedure Set Constraints(Value: WordBool); safecall; 
    procedure Reset; safecall; 
    procedure SetParams(Values: OleVariant); safecall; 
    property Data: OleVariant read Get_Data; 
    property Constraints: WordBool read Get Constraints write 
    Set Constraints; 
    end; 


       RemoteServer 

       Provide rName     
RemoteServer   RemoteServer  ClientDataSet, ,  
 Open    Active  True,   
 ClientDataSet . 

    TClientDataSet = class (TDataSet) 
    published property Pro viderName: string ...; 
    property RemoteServer: TCustomRemoteServer ...; 
    end; 

       ClientDataSet    . 
    1.  RemoteServer     (  
  ). 
    2.  IProvider     GetProvider,  
      ProviderName  ClientDataSet. 
    3.  IProvider   IProvider  ClientDataSet. 
    4.     IProvider. GetRecords  OleVariat. 
    5.       ClientDataSet   
 AppendData. 
      ClientDataSet   RemoteServer  
      ClientDataSet. 
       (Provider 
     Provider  ClientDataSet,       
 DBDataSet,   IProvider,   Provider. 

    TClientDataSet = class (TDataSet) 


     14.                            333 


    public 
    property Provider: IProvider ...; 
    end; 
    TDBDataSet = class (TDBEDataSet) 
    public 
    property Provider: IProvider ...; 
    end; 
    TProvider = class(TCustomProvider) 
    public 
    property Provider: IProvider ... ; 
    end; 

     Provider      (  
public),        Provider   
,   DBDataSet. 

    TProvider = class(TCustomProvider) 
    published 
    property DataSet: TDBDataSet ...; 
    end; 

       DBDataSet   Provider,   
 DataSet  Provider   Table  Query.   
   Provideri ,  Tablel   
  DBDataSet   . 

    Provideri.DataSet := Tablel; 

      Provider   IProvider,   
 Provider   .  , ,  
 ,     ,   
      . 

     

         provider   
,     BDEProv   uses 
 .    ,   , , 
  ,       
IProvider    ,      provider  
  nil. 
             IProvider, 
 ClientDataSet      
 Open,  ,      RemoteServer. 

    ClientDataSet.Provider := Table.Provider; 
    ClientDataSet.Open; 

      IProvider    ,  
   ,    . 
      Provider  DBDataSet     
 ,           
  ,   ClientDataSet.  ,  
 . 
         IProvider   
ClientDataSet         
 DBDataSet.      -   
        . 
  ,        
  DBDataSet.       
      . 

    334                                      III.     


    TClientDataSet = class (TDataSet) 
    public 
    function GetNextPacket: Integer; 
    published 
    property FetchOnDemand: Boolean ... default True; 
    property PacketRecords: Integer ... default -1; 
    end; 

     FetchOnDemand   ,    
.     True  ,  
   IProvider ,   
ClientDataSet      .    
  ,   FetchOnDemand  False 
   GetNextPacket    .  
      DBDataSet,  
GetNextPacket   ,     PacketRecords. 
        ClientDataSet     
 ,         
 PacketRecords.      -1,    
    ClientDataSet.    
PacketRecords  0,     .   
  IProvider. GetMetaData.     
   ,    .  
 PACKETSAMPLE. PAS    FetchOnDemand  
PacketRecords   GetNextPacket. 

      Data   Get_Data 

     Data    ClientDataSet  IProvider 
       OleVariant  . 

    TClientDataSet = class(TDataSet) 
    public 
    property Data: OleVariant ...; 
    end; 
    TClientDataSet = class(TDataSet) 
    public 
    property Data: OleVariant ...; 
    end; 

     ClientDataSet  ,   Data  
 .       ,   
  PacketRecords.  ClientDataSet   
     Data: 

    ClientDataSet.Data := Table.Povider.Data; 

     ,   Data  Null,    
ClientDataSet   .   Provider   
 Data    IProvider. Get_Data.  Provider 
   Get_Data,       . 

         DBDataSet 

           IProvider  
 GetRecords,     . 
    TProvider = class(TCustomProvider) 
    public 


     14.                            335 


    function GetRecords(Count: Integer; out RecsOut: Integer): 
    OleVariant; override; 
    procedure Reset; ... 
    end; 

        (coynf-,    
  <-,       
),  GetRecords    OleVariant,  
   .     
count-,    ,   .  
   ,    IProvider.GetMetaData.  
GetData    ,   count-,  -1. , , 
   .     GetRecords 
,   ClientDataSet .AppendData   
     . ,  , , 
   GetNextPacket.  AppendData  . 

    TClientDataSet = class(TDataSet) 
    public 
    procedure AppendData(Data: OleVariant; HitEOF: Boolean); 
    end; 

       GetRecords, HitEOF,   
ClientDataSet  ,      , ..  
  .  , ,     
OleVariant   Data  ClientDataSet,    
 ,        ClientDataSet. , 
,  Reset   ,   Provider  
         DBDataSet. 
             Provider 
  OnGetData.       
 OnGetData   Provider. 

    TProviderDataEvent = procedure (DataSet: TClientDataSet) 
    of object; 
    TProvider = class(TCustomProvider) 
    published 
    property OnGetData: TProviderDataEvent ...; 
    end; 

      ,   GetRecords    
OnGetData      . 

           DataRequest 

     DataRequest     IProvider,    
Provider.          
   Provider   .      
DataRequest    OnDataRequest  Provider. 
  ,    ,  . 

    TDataRequestEvent = function (Sender: TObject; Input: 
    OleVariant) of object; 
    TProvider = class(TCustomProvider) 
    published 
    property OnDataRequest: TDataRequestEvent ...; 
    end; 

      OnDataRequest  ,     
 VCL-,     .   
  ,      
 VCL.     .    
   OnDataRequest,     . 

    336                                      III.     

       Sender,   OnDataRequest 
  OleVariant,   Input.     
 ,   .  ,     
  .         
,  Null. 

        

       ClientDataSet    
  ,       TStrings.  
  LoadFromFile, LoadFromStream, SaveToFile  SaveToStream  
     ClientDataSet        
 . 

    TClientDataSet = class(TDataSet) 
    public 
    procedure LoadFromFile(const FileName: string); 
    procedure LoadFromStream(Stream: TStream); 
    procedure SaveToFile(const FileName: string); 
    procedure SaveToStream(Stream: TStream) ; 
    end; 

         ClientDataSet. Data 
 OleVariant.       ,    
  VarArrayLock,   ( )   
 ,     . 

      14.2,     LOADSAVESAMPLE. PAS, 
   SaveToFile  LoadFromFile. 

     14.2. LOADSAVESAMPLE . PAS.      
 ClientDataSet  

    SaveToFileLoadFromFile 
    procedure TLoadSaveSampleForm.SaveItemClick(Sender: TObject); 
    begin 
    if SaveDialog.Execute then begin 
    ClientDataSet.SaveToFile(SaveDialog.FileName) ; 
    ClientDataSet.Data := Null; 
    ClientDataSet.IndexName := ''; 
    Saveltem.Enabled := False; 
    Loadltem.Enabled := True 
    end 
    end; 
    procedure TLoadSaveSampleForm.LoadItemClick(Sender: TObject); 
    begin 
    with ClientDataSet do begin 
    LoadFromFile(SaveDialog.FileName); 
    Addlndex('CustNo', 'CustNo', [ixPrimary]) ; 
    Addlndex('ByCompany', 'Company', [ixCaseInsensitive]); 
    IndexName := 'ByCompany' 
    end; 
    Saveltem.Enabled := True; 
    Loadltem.Enabled := Falser
    end; 

     ,       IndexName 
      ,     
   .  ,     
    .    ClientDataSet 
  ,    ,     , .  
       ,  
 ClientDataSet  . 

     14.                            337 


     

              
   ,    .   , 
  clientDataSet,      
.  saveToFile  LoadFroraFile    
,     , , ,   
    ,      . 
      Load  Save        
,       .   
 LoadFromStream  SaveToStream      
 ,       TStream. 
   ,    
ClientDataSet   . ,   
   TStream,   ,    
   Web      . 

      CreateDataSet 

      FieldDefs    ,   
   ClientDataSet.    
     CreateDataSet. 

    TClientDataSet = class(TDataSet) 
    public 
    procedure CreateDataSet; 
    end; 

     ,   IndexDefs,    
.          
,       CreateDataSet.   
  ,       
.       
CREATESAMPLE1. PAS, CREATESAMPLE2. PAS, CREATESAMPLE3. PAS     
,         
  ClientDataSet  .   14.3    
FieldDefs   IndexDefs. 

     14.3. \UDELPHI3\CH14\CREATESAMPLE3. PAS.    
   FieldDefs  

    IndexDefs  ClientDataSet 
    procedure TCreationSampleForm.FormCreate(Sender: TObject); 
    begin 
    with ClientDataSet.FieldDefs do begin 
    Add('CustNo', ftFloat, 0, False); 
    Add('Company', ftString, 30, False); 
    AddfAddrl', ftString, 30, False); 
    Add('Addr2', ftString, 30, False); 
    Add('City', ftString, 15, False); 
    Add('State', ftString, 20, False); 
    Add('Zip', ftString, 10, False); 
    Add('Country', ftString, 20, False); 
    Add('Phone', ftString, 15, False); 
    Add('FAX', ftString, 15, False); 
    Add('TaxRate', ftFloat, 0, False); 
    Add('Contact', ftString, 20, False); 
    Add('LastInvoiceDate', ftDateTime, 0, False); 
    end; 
    with ClientDataSet.IndexDefs do begin 
    Add('CustNo', 'CustNo', [ixPrimary]); 
    Add('ByCompany', 'Company', [ixCaseInsensitive]); 
    end; 
    ClientDataSet.IndexName := 'CustNo'; 
    ClientDataSet.CreateDataSet 
    end; 


    338                                      III.     


        ClientDataSet 

       ClientDataSet ,    ( 
  )       
 .       , 
,  ,   ClientDataSet   
  .            .   
       CHANGETRACKINGSAMPLE.PAS. 

      

      , ,   ClientDataSet  
   ,     Delta.   
     . 

    TUpdateStatus =(usUnmodified, usModified, usinserted, usDeleted); 
    TClientDataSet = class(TDataSet) 
    public 
    function UpdateStatus: TUpdateStatus; 
    property ChangeCount: Integer ... ; 
    property Delta: OleVariant ...; 
    property LogChanges: Boolean ... ; 
    end; 

           .  
 ,   LogChanges  False, ,  
,          
ClientDataSet.  ChangeCount     . 


     
           ,   
ClientDataSet     .     
       , 
   . 

     . 14.1   Customer. DB,   
ClientDataSet     . 
     UpdateStatus     TUpdateStatus. 
(          
    DBDataSet.)    
UpdateStatus        ,  
  .       
UpdateStatus  .     ,  
 Delta    ClientDataSet    
 .  . 14.2      ClientDataSet 
  ,     .    
  ,    . 
       ClientDataSet    
 .    CHANGEINDEX   
 ,   -  .  
  ,      ,    
   .  ,     
,       .  
  DEFAULT_ORDER        
     .  . 14.3   
 ClientDataSet    CHANGEINDEX. 

     14.                            339 
     III.     


    . 14.1.  Customer. DB,   clientDataSet 
     

    . 14.2.   clientDataSet   ,   
   

    . 14.3.   ClientDataSet    CHANGE INDEX 


      

     ,     ClientDataSet,   
  : CanceIUpdates, RevertRecord  UndoLastChange.   
     DBCLIENT. . 

    TClientDataSet = class (TDataSet) 
    public 
    procedure CancelUpdates; 
    procedure RevertRecord; 
    function UndoLastChange(FollowChange: Boolean): Boolean
    end; 

       (   )  
,   ""       
       , ,  
.        
,   UndoLastChange.      
       ,   
,     . ,    
    ,   , ,   
UndoLastChange ,   ,    ,  
,       .    
   ,    .    
 UndoLastChange        
.          
   .  UndoLastChange   
    FollowChange,  , 
       . 
       CancelUpdates  RevertRecord   
  .  CancelUpdates      
,    .  RevertRecord  
     .       
  .  RevertRecord     
,      . 

     
         ,    
,   ,   ,    
 CancelUpdates  ondoLastChange        
,     .   
   ,          RevertRecord. 


      

             
     .  ,   
  .       . 
   .    ClientDataSet  Provider 
   ,   ,   
   . 

      ApplyUpdates 

         ClientDataSet   
ClientDataSet  Provider  ApplyUpdates  -. 

    TProvider = class(TCustomProvider) 
    public 
    function ApplyUpdates(Delta: OleVariant; MaxErrors: Integer; 
    out ErrorCount: Integer): OleVariant; 
    end; 
    TClientDataSet = class(TDataSet) 


     14.                            341 


    public 
    function ApplyUpdates(MaxErrors: Integer) : Integer
    procedure MergeChangeLog; 
    function Reconcile(Results: OleVariant): Boolean; 
    end; 

      ApplyUpdates  Provider    
 Delta.      Delta,    
TClientDataSet.    MaxErrors   
     .  
, ErrorCount,   ,   
  ApplyUpdates.      
  Delta,   ,    
  . 
      ApplyUpdates  ClientDataSet,    
Provider   IProvider.     
     ClientDataSet  
 RemoteServer.  ClientDataSet .ApplyUpdates,   , 
  ApplyUpdates  Provider   IProvider. 
 ApplyUpdates  ClientDataSet     
(       IProvider)    
,   . 
           ,  
       Apply Updates.  
 ApplyUpdates  ClientDataSet   
 ClientDataSet. Reconcile.      ApplyUpdates 
   ,   Reconcile   ClearChangeLog 
   Delta  ClientDataSet.    
- . 

          OnUpdateError 

             
(, ,   ClientDataSet,      
    ).     
;    OnUpdateError  Provider, 
  . 

    TUpdateKind = (ukModify, uklnsert, ukDelete); 
    TResolverResponse = (rrSkip, rrAbort, rrMerge, rrlgnore) ; 
    TResolverErrorEvent = procedure(DataSet: TClientDataSet; 
    E: EUpdateError; UpdateKind: TUpdateKind; 
    var Response: TResolverResponse) of object; 
    TProvider = class(TCustomProvider) 
    published 
    property OnUpdateError: TResolverErrorEvent ...; 
    end; 

      OnUpdateError       
 .        , 
  .     . 
     ClientDataSet,      
,  .        
   OldValue,      
  CurValue    ,   
,    NewValue. 
     ,    OnUpdateError,   
   ,    .  
    .      
 Provider  ,       
 .         
- Response (. 14.1). 
       OnUpdateError  Response    
 rrAbort,   MaxErrors  ApplyUpdates   0,  
 rrSkip,   MaxErrors  . 
           ,  
         
ClientDataSet.    ,     
ClientDataSet,   MergeChangeLog.     
 ChangeCount   ,   Delta  ,  
   .   ,   
ClientDataSet. Data  Null,       
ClientDataSet.      ,    
    . 

    342                                      III.     


     14.1.    Response 

    	 

    rrSkip	  .   . 
     Delta 
    rrAbort	   .    
.       Delta 
    rrMerge	         
   Delta 
    rrApply	  ,   . 
     Delta 
    rrlgnore	  .   . 
     Delta 


          OnReconcileError 

         ,   
    Reconcile.    
  OnReconcileError  ClientDataSet cni  . 

    TReconcileAction = (raSkip, raAbort, raMerge, raCorrect, 
    raCancel, raRefresh) ; 
    TReconcileErrorEvent = procedure(DataSet: TClientDataSet; 
    E: EReconcileError; UpdateKind: TUpdateKind; 
    var Action: TReconcileAction) of object; 
    TClientDataSet = class(TDataSet) 
    published 
    property OnReconcileError: TReconcileErrorEvent ...; 
    end; 

         ,     
 .         
  Provider. OnUpdateError.  Action    
  .     . 14.2. 

     14.2.    Action 

               

    raSkip	  .   . 
     Delta 
    raAbort	   .   
   Delta 
    raMerge	         
  Delta 
    raCorrect	  ,     
   Delta 
    raCancel	     .  
    Delta 
    raRefresh	  .    
  Delta 

       OnReconcileError  Action    raAbort, 
  ApplyUpdates   ,   raSkip    
.  Reconcile   True,     
,  ,   ,  .  ,  
ChangeCount  ,  ,    Delta   
 Null. 

     14.                            343 


     

            Delphi. 
 ,    ClientDataSet    
IProvider   ,  ,    
,    ClientDataSet,     
      .   , 
      Delphi. 
     ,      CLNTPROJ. DPR  
SERVER.DPR,    Delphi.      
 (  )    .   
   COM/OLE Automation,    . 

    344                                      III.    