Реферат: Модель briefcase средствами MIDAS

Чтение данных «порциями»

Обмен данных между тонким клиентом и сервером приложений происходит пакетами. Пакет содержит информацию о метаданных и/или набор записей. Интересной возможностью MIDAS является передача данных «порциями». Естественно, данная возможность реализуется лишь во время наличия соединения с центральным сервером. Включение данной возможности осуществляется установкой свойства FetchOnDemand ClientDataset-а в true. К сожалению, даже при этом запрос к серверу базы данных выбирает все записи сразу. Об одном из способов устранения этого недочета я и хочу рассказать.

Первое, что необходимо сделать, это изменить текст SQL-запроса, находящегося в свойстве CommandText компонента adsParams (напомню, что это ADODataSet), на следующий:

select Top 2 * from Params where ParamID > :ID

При этом записи будут выбираться порциями по 2. Естественно, что в реальных приложениях размер пакета будет больше этого числа. Конкретное число представляет собой компромисс между затратами времени на передачу пакета по сети (чем больше размер пакета, тем выше задержки при его передаче) и задержками, возникающими от частого обращения с запросами к серверу БД. (на практике размер такого пакета зависит от размера записи, но в среднем составляет от 30 до 250 строк. – прим.ред.)

Остается решить проблему, как клиент будет передавать серверу идентификатор последней считанной записи (ParamID). Проблема эта возникает потому, что сервер приложений не сохраняет состояние между вызовами клиентов. С одной стороны, это делает сервер приложений более масштабируемым, но с другой, требует дополнительного кода на стороне клиента для хранения состояния.

Для передачи значения первичного ключа последней прочитанной клиентом записи можно использовать событие BeforeGetRecords. Данное событие определено для набора данных ClientDataSet на клиенте и компонента провайдера на сервере. Перед получением пакета с записями это событие сначала генерируется на клиенте, а затем у провайдера на сервере приложений. Событие имеет параметр, передаваемый по ссылке OwnerData (типа OleVariant). Вот через этот параметр мы и будем передавать значение ключа последней записи. Код обработчика в клиентском приложении:

procedure TForm1.cdsParamsBeforeGetRecords(Sender: TObject;

var OwnerData: OleVariant);

begin

if not cdsParams.FieldByName('ParamID').IsNull then

OwnerData:=cdsParams.FieldByName('ParamID').Value;

end;

Соответственно для провайдера на сервере приложений:

procedure TMIDAS_bc.dspParamsBeforeGetRecords(Sender: TObject;

var OwnerData: OleVariant);

begin

if not VarIsNull(OwnerData) and not VarIsClear(OwnerData) then

adsParams.Parameters.ParamValues['ID']:=OwnerData;

end;

Чтобы инициировать подкачку, необходимо обрабатывать еще одно событие объекта ClientDataSet – OnScroll:

procedure TForm1.cdsParamsAfterScroll(DataSet: TDataSet);

begin

if cdsParams.Eof then

cdsParams.GetNextPacket;

end;

Вызов cdsParams.GetNextPacket; как раз и инициирует получение следующего пакета данных.

Как выяснилось, код метода GetNextPacket содержит ошибку, выражающуюся в отказе чтения следующего пакета после нескольких попыток чтения первого пакета. Связано это с неправильным значением переменной ProviderEOF в описанной выше ситуации.

function TCustomClientDataSet.GetNextPacket: Integer;

begin

К-во Просмотров: 212
Бесплатно скачать Реферат: Модель briefcase средствами MIDAS