M Y D E L P H I 7 . R U Самоучитель программирования  
 
  • Главная
  •  

     

    Получение данных от компонента - провайдера

    Компонент TClientDataSet получает доступ к удаленным данным через компонент соединения DataSnap (см. гл. 20). В зависимости от используемой технологии, это могут быть технологии TDCOMConnection, TSocketConnection, TWebConnection ИЛИ TCorbaConnection.

    Компонент TClientDataSet связывается с компонентом соединения при помощи свойства

    property RemoteServer: TCustomRemoteServer;

    Если соединение настроено правильно, то ссылка на интерфейс IAppServer в свойстве

    property AppServer: IAppServer;

    совпадает со свойством

    ClientDataSet.RemoteServer.AppServer;

    После настройки соединения в свойстве

    property ProviderName: string;

    можно выбрать один из компонентов-провайдеров, которые доступны на сервере приложений, выбранном в компоненте соединения.

    Если провайдер был подключен правильно, свойство только для чтения

    property HasAppServer: Boolean;

    автоматически принимает значение True.

    Теперь компонент готов к приему данных. При использовании метода

    procedure Open;

    или свойства

    property Active: Boolean;

    компонент получает от провайдера первый пакет данных.

    Размер пакета определяется свойством

    property PacketRecords: Integer;

    которое задает число записей, передаваемое в одном пакете. Если свойство имеет значение —1 (это значение по умолчанию), передаются все записи набора данных. Если оно равно 0 — клиенту передаются только метаданные о наборе данных.

    Если соединение клиента с сервером медленное, число записей в пакете можно уменьшить, но желательно так, чтобы при использовании компонентов TDBGrid полученные в одном пакете записи полностью заполняли рабочую область этого компонента.

    Одновременно разработчик имеет возможность управлять доставкой следующих пакетов. Для этого используется метод

    function GetNextPacket: Integer;

    Например, это можно сделать следующим образом:

    procedure TDataModulel.ClientDataSetAfterScroll(DataSet: TDataSet);

     begin

    if ClientDataSet.EOF then ClientDataSet.GetNextPacket; end;

    Свойство

    property FetchOnDemand: Boolean;

    должно иметь значение False. При значении True оно разрешает компоненту получать новые пакеты данных по мере надобности, например, при необходимости прокрутки записей в компоненте TDBGrid.

    До и после получения очередного пакета соответственно выполняются обработчики событий:

    type

    TRemoteEvent = procedure(Sender: TObject;

     var OwnerData: OleVariant) of object;

    property BeforeGetRecords: TRemoteEvent; 

    property AfterGetRecords: TRemoteEvent;

    Содержимое очередного пакета представлено свойством

    property Data: OleVariant;

    Данные в нем хранятся в транспортном формате, готовые для пересылки. Причем его можно использовать не только для чтения, но и для записи, формируя пакет данных для отправки провайдеру:

    var OwnerData: OleVariant;

    MaxErrors, ErrorCount: Integer;

    MaxErrors := 0;

    ResultDataSet.Data := SourceDataSet.AppServer.AS_ApplyUpdates('', SourceDataSet.Delta, MaxErrors, ErrorCount, OwnerData);

    Метод AS_AppiyUpdates передает данные, содержащиеся в буфере Delta, провайдеру на сервер и возвращает записи, сохранить которые не удалось. Подробнее о методе AS_ApplyUpdates см. табл. 21.1.

    Размер буфера Data в байтах возвращает свойство

    property DataSize: Integer;