Н. 3, Елманова. C++Builder 3.0, архитектура "клиент/сервер" и Internet
IJUfr Клиентское приложение
		К	И	+	-	Ж			<?•
Сохранить
LAST NAME
FIRST NAME
ACCTJJBR
JDavis ; ADDRESSJ
Jennifer CITY
j     1023435 STATE ZIP
IMA~ EFEFT
! j 100 Cranberry si|Wellesley
'TELEPHONE   DATEJDPEN	SS_NUMBER
J516-292-3345   |01.01.33 PICTURE	BIRTH.DATE
cus1.bmp OCCUPATION
|15.07.60
OBJECTIVES
| 40530Э771
_ RISKJ-EVEL ]gg
~ {MED
B"i
[Programmer INTERESTS
j Growth
j Enjoys horseback riding and paints.
I"-
АШЩ^В:1зхмва[	SHARES:	PUR PRICE	PUR_DATE
1 023495 ;VG	2000	20	02.04.93
1 023495 |HGT	""""""""" 'iooo	30	20.01 .SO'"""""
1023495; EMC	...................... ^	30	оТо2.эо
1023495 iCIN	1500	38	оэЖэ'з"
Рис. 8.15. Главная форма клиентского приложения
Отметим, что, если пользователь редактирует данные в клиентском приложении, они не переносятся непосредственно на сервер баз данных, а вместо этого кэшируются. Фактически компонент TClientDataSet осуществляет доступ к содержимому кэша и при необходимости инициирует добавление в него записей и перенос их обратно на сервер. Идея кэширования данных не нова: применять его можно и в случае использования классической двухзвенной архитектуры (например, установив равным true свойство CachedUpdates компонента ТТаЫе или TQuery). Однако для "тонких" клиентов, связь которых с сервером приложений может осуществляться самыми разными способами, в том числе с помощью каналов, не обеспечивающих стабильную постоянную связь (например, с помощью модемного соединения' по телефонной линии), этот способ редактирования данных является основным. На нем же основана так называемая Briefcase Model (модель работы с данными без постоянного соединения), когда клиенты лишь'время
Создание многозвенных информационных систем с помощью C++Builder 3.0
от времени соединяются с сервером приложений для синхронизации данных, а подавляющую часть времени работают с кэшем и локальными внешними- устройствами, периодически сохраняя и, восстанавливая свои данные с^_. помощью методов' SaveToFile() и LoadFrpmFileO компонента TClientDataSet.
Для инициации процесса реального сохранения в базе данных используется метод ApplyUpdatesQ компонента TClientDataSet. В качестве параметра этот метод употребляет целое число, равное максимально допустимому числу ошибок сервера, после которого следует прекратить попытки физического сохранения данных (значение -1 показывает, что следует пытаться сохранить все данные независимо от числа ошибок).
Почему предусмотрена возможность ошибок сервера? Ответ очевиден -клиентское приложение может ничего не знать о правилах ссылочной целостности и иных ограничениях, содержащихся на сервере баз данных, и только попытка физического сохранения изменений в базе данных может выявить их нарушения (вспомним, что на клиентской рабочей станции может даже не быть библиотеки BDE):
Для сохранения данных из кэша на сервере баз данных создадим обработчики событий, связанных с нажатием на кнопки "Сохранить" и "Отменить":
fastcall TForml::Button1Click(TObject *Sender)
II---void
{
ClientDataSetl->ApplyUpdates(-1);
ClientDataSet2->ApplyUpdates(-1);
}
II---
void
{
ClientDataSetl->CancelUpdates();
ClientDataSet2->CancelUpdates();
} //............-.................
fastcall TForml::Button2Click(TObject *Sender)
Далее можно запустить и протестировать клиентское приложение. Обратите внимание: показания счетчика соединений на главной форме сервера приложений должны измениться, так как теперь у сервера приложений два клиента - среда разработки и запущенное приложение (рис. 8.16).
180
181