|
Получение данных от компонента - провайдера
Компонент 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;
|