Всё сдал! - помощь студентам онлайн Всё сдал! - помощь студентам онлайн

Реальная база готовых
студенческих работ

Узнайте стоимость индивидуальной работы!

Вы нашли то, что искали?

Вы нашли то, что искали?

Да, спасибо!

0%

Нет, пока не нашел

0%

Узнайте стоимость индивидуальной работы

это быстро и бесплатно

Получите скидку

Оформите заказ сейчас и получите скидку 100 руб.!


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

Тип Реферат
Предмет Информатика
Просмотров
1112
Размер файла
33 б
Поделиться

Ознакомительный фрагмент работы:

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

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

Михаил Голованов

В прошлом номере журнала я писал о реализации модели Briefcase с помощью ADO. В отличие от ADO, средства работы с отключенными наборами данных в MIDAS были реализованы с самой первой версии. Реализация модели Briefcase средствами MIDAS несколько проще, хотя и здесь есть свои подводные камни.

Приложение MIDAS состоит из двух частей: сервера приложений и тонкого клиента. Сервер приложений «общается» с сервером БД (или другим источником данных), реализует бизнес-правила и предоставляет тонкому клиенту данные по запросу. Функция тонкого клиента – это отображение данных пользователю.

В качестве примера мы спроектируем простой сервер приложений и тонкий клиент для работы с базой, описанной в предыдущей части статьи. Сервер приложений реализуем как модуль MTS/COM+. Никаких особенностей создания сервера приложений для модели briefcase нет, поэтому я не буду описывать этот процесс в деталях. В IDE Delphi создадим новый проект приложения для MTS/COM+, выбрав пункт меню File/New/Other, и в появившемся диалоге выберем пункт ActiveX Library с закладки ActiveX. Затем включим в проект новый удаленный модуль данных (File/New/Other и пункт Transactional Datamodule с закладки Multitier).

В удаленном модуле данных разместим следующие компоненты и установим значения их свойств согласно таблице 1, приведенной ниже.

КомпонентСвойствоЗначение
Conn:TADOConnectionConnectionStringНастроить на соединение с БД
adsParams:TADODataSetConnectionConn
CommandTextCommandTextselect * from Params
dspParams:TDataSetProviderDataSetadsParams

Таблица 1

Откомпилируйте проект сервера и установите полученную dll в новое MTS/COM+-приложение c именем MIDAS_briefcase, с помощью пункта меню Run/Install COM+ Object.

Тонкий клиент представляет собой DeskTop-приложение. Для связи с сервером приложений клиент использует один из компонентов типа Connection с закладки DataSnap (мы воспользуемся DCOMConnection) и специальный DataSet – ClientDataSet.

В таблице 2 приведены свойства, влияющие на работу компонентов тонкого клиента с сервером приложений, а также их значения.

КомпонентСвойствоЗначение
DCOMConn:TDCOMConnectionServerNameProject1.MIDAS_bc
LoginPromptfalse
cdsParams:TClientDataSetRemoteServerDcomConn
ProviderNamedspParams

Таблица 2

Внешний вид формы приложения тонкого клиента приведен на рисунке 1.

Рисунок 1

Получение данных с центрального сервера

Получение данных с сервера приложений аналогично приведенному в примере для ADO. Код приведен ниже.

procedure TForm1.act_RemoteConnectExecute(Sender: TObject);

begin

try

with cdsParams do try

Close;

RemoteServer:=DCOMConn;

FileName:='';

Active:=true;

except on E:Exception do

MessageDlg(Format('Ошибкаподключенияксерверу: %s', [E.Message]),

mtError, [mbOk], 0);

end;

finally

DCOMConn.Close;

end;

Все просто, но для подключения к серверу надо не забывать сбрасывать имя файла кэша (свойство FileName) и закрывать соединение с сервером после получения данных.

Чтение и запись данных из локального кэша

Для чтения данных из локального кэша у ClientDataSet есть метод LoadFromFile:

procedure TForm1.act_ConnectLocalExecute(Sender: TObject);

begin

with cdsParams do

begin

RemoteServer:=nil;

FileName:=ExtractFilePath(Application.ExeName) + LocalFile;

LoadFromFile(FileName);

end;

end;

Для записи в локальный кэш – метод SaveToFile:

with cdsParams do

SaveToFile(ExtractFilePath(Application.ExeName) + LocalFile);

Опять же никаких сюрпризов.

Сохранение данных на сервер, отмена сделанных изменений

Для сохранения данных на сервер предназначен метод CilentDataSet-а ApplyUpdates. Параметр данного метода указывает макисимально допустимое количество ошибок при передаче данных на сервер.

procedure TForm1.act_SaveToServerExecute(Sender: TObject);

begin

if cdsParams.Active and (cdsParams.ApplyUpdates(0) = 0) then

act_RemoteConnect.Execute;

end;

При возникновении ошибки генерируется событие OnReconcileError. Обработка ошибки осуществляется с помощью стандартного модуля обработчика ошибки, подключить этот модуль в проект можно, выбрав ReconcileErrorDialog на закладке Dialogs (File/New/Other). Обработчик OnReconcileError будет выглядеть при этом следующим образом:

procedure TForm1.cdsParamsReconcileError(DataSet: TCustomClientDataSet;

E: EReconcileError; UpdateKind: TUpdateKind;

var Action: TReconcileAction);

begin

Action:=HandleReconcileError(DataSet, UpdateKind, E);

end;

Для отмены внесенных изменений ClientDataSet содержит метод CancelUpdates.

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

Обмен данных между тонким клиентом и сервером приложений происходит пакетами. Пакет содержит информацию о метаданных и/или набор записей. Интересной возможностью 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

CheckActive;

if ProviderEOF then Result := 0 else

begin

UpdateCursorPos;

if (FPacketRecords = 0) and FMasterLink.Active and

(FMasterLink.Fields.Count > 0) then CheckDetailRecords else

begin

AddDataPacket(DoGetRecords(FPacketRecords, Result, 0, '', Unassigned),

Result <> FPacketRecords);

ProviderEOF := Result <> FPacketRecords;

end;

Resync([]);

end;

end;

Исправлено это было явным присвоением ProviderEOF значения false перед выполнением проверки if ProviderEOF then Result := 0 else …...

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


Нет нужной работы в каталоге?

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

Цены ниже, чем в агентствах и у конкурентов

Вы работаете с экспертами напрямую. Поэтому стоимость работ приятно вас удивит

Бесплатные доработки и консультации

Исполнитель внесет нужные правки в работу по вашему требованию без доплат. Корректировки в максимально короткие сроки

Гарантируем возврат

Если работа вас не устроит – мы вернем 100% суммы заказа

Техподдержка 7 дней в неделю

Наши менеджеры всегда на связи и оперативно решат любую проблему

Строгий отбор экспертов

К работе допускаются только проверенные специалисты с высшим образованием. Проверяем диплом на оценки «хорошо» и «отлично»

1 000 +
Новых работ ежедневно
computer

Требуются доработки?
Они включены в стоимость работы

Работы выполняют эксперты в своём деле. Они ценят свою репутацию, поэтому результат выполненной работы гарантирован

avatar
Математика
История
Экономика
icon
159599
рейтинг
icon
3275
работ сдано
icon
1404
отзывов
avatar
Математика
Физика
История
icon
157252
рейтинг
icon
6079
работ сдано
icon
2741
отзывов
avatar
Химия
Экономика
Биология
icon
105734
рейтинг
icon
2110
работ сдано
icon
1318
отзывов
avatar
Высшая математика
Информатика
Геодезия
icon
62710
рейтинг
icon
1046
работ сдано
icon
598
отзывов
Отзывы студентов о нашей работе
67 201 оценка star star star star star
среднее 4.9 из 5
ВолгГму
Великолепная работа, быстро и качественно, приятно общаться с такими мастерами
star star star star star
Техникум
Алексей, Спасибо Вам большое! Очень приятно когда люди, каждый занят своим делом. В больше...
star star star star star
СИБИТ
Оценка за реферат "отлично"! Спасибо исполнителю, всегда быстро и качественно.
star star star star star

Последние размещённые задания

Ежедневно эксперты готовы работать над 1000 заданиями. Контролируйте процесс написания работы в режиме онлайн

Джабарлы Анар Самир оглы 2 cеместр мти левел

Отчет по практике, Технологическая (проектно-технологическая) практика | У.О | Учебная практика

Срок сдачи к 9 авг.

2 минуты назад

Рзаева Сона Рашад кызы Левел синергия 4 семестр

Отчет по практике, Переводческая практика | У.О | Учебная практика

Срок сдачи к 19 июля

2 минуты назад

Ахмедова Мальвина Акифовна 4 семесип левел синергия

Отчет по практике, Учебно-ознакомительная практика | У.О | Учебная практика

Срок сдачи к 25 сент.

3 минуты назад
3 минуты назад

Решить 3 вариант. 2 задачи.

Решение задач, Теория вероятностей и математическая статистика

Срок сдачи к 19 июля

4 минуты назад

Дневник практики

Отчет по практике, Юридический факультет

Срок сдачи к 18 июля

4 минуты назад

Дневник практики

Другое, Дневник практики

Срок сдачи к 18 июля

5 минут назад

20-25 стр работа, отсутствие ИИ

Курсовая, Теория государства и права

Срок сдачи к 31 июля

5 минут назад

Помощь на экзамене по русскому языку

Онлайн-помощь, Русский язык

Срок сдачи к 23 июля

6 минут назад

Помощь на экзамене по медицинской биологии

Онлайн-помощь, Медицинская биология

Срок сдачи к 20 июля

6 минут назад

отчет по учебной практике

Отчет по практике, Промышленное и гражданское строительство

Срок сдачи к 13 июля

6 минут назад

Отчет ознакомительная практика

Отчет по практике, гражданское и промышленное строительство

Срок сдачи к 13 июля

7 минут назад

Отчет по производственной практике заводская(редактировать)

Отчет по практике, Химическая технология

Срок сдачи к 14 июля

7 минут назад

Выполнить отчет по практике

Отчет по практике, Отчет по производственной (конструкторской)

Срок сдачи к 21 июля

7 минут назад

Продолжительность 4 недели примеры индивидуальных заданий в конце текста, практика на базе отдела мвд название органа заполню самостоятельно

Отчет по практике, Отчет по практике в колледже дистанционного образования это все известные требования, право

Срок сдачи к 19 июля

7 минут назад

Сделать чертеж детали

Чертеж, Компьютерная графика

Срок сдачи к 19 июля

9 минут назад

Написать отчет по практике. Менеджмент. Д-00516

Отчет по практике, Менеджмент

Срок сдачи к 19 июля

10 минут назад

Сделать отчет по производственной практике

Отчет по практике, Экономическая безопасность

Срок сдачи к 18 июля

10 минут назад
planes planes
Закажи индивидуальную работу за 1 минуту!

Размещенные на сайт контрольные, курсовые и иные категории работ (далее — Работы) и их содержимое предназначены исключительно для ознакомления, без целей коммерческого использования. Все права в отношении Работ и их содержимого принадлежат их законным правообладателям. Любое их использование возможно лишь с согласия законных правообладателей. Администрация сайта не несет ответственности за возможный вред и/или убытки, возникшие в связи с использованием Работ и их содержимого.

«Всё сдал!» — безопасный онлайн-сервис с проверенными экспертами

Используя «Свежую базу РГСР», вы принимаете пользовательское соглашение
и политику обработки персональных данных
Сайт работает по московскому времени:

Вход
Регистрация или
Не нашли, что искали?

Заполните форму и узнайте цену на индивидуальную работу!

Файлы (при наличии)

    это быстро и бесплатно