Создание "маленького" приложения с базой данных без использования BDE

Создание "маленького" приложения с базой данных без использования BDE
Как ни парадоксально, разработчики, занимающиеся созданием подобных приложений, даже имея клиент-серверные версии Delphi или C++Builder, просто не обращают внимания на страницу MIDAS палитры компонентов этих средств разработки, считая, что эти компоненты - не для их задач. А ведь именно там и содержится компонент TClientDataSet, позволяющий создать такой файл и использовать его. 
 
Компонент TCLientDataSet обычно используется в "тонких" клиентах серверов доступа к данным. Подобные приложения широко используют кэширование данных в оперативной памяти рабочей станции и нередко учитывают возможность разрыва связи с сервером доступа к данным. Соответственно компонент TCLientDataSet позволяет сохранить содержимое своего кэша в файле и загрузить его оттуда. После этого можно просто забыть о сервере доступа к данным и работать только с этим файлом (его можно даже редактировать). Библиотека BDE при этом не нужна - "тонкие" клиенты ее не используют (в том числе и отчуждаемые "тонкие" клиенты). 
 
Создадим пример такого "маленького" приложения. Но прежде создадим приложение для переноса данных из таблиц в файл, содержащий кэш компонента TCLientDataSet. Для этого создадим новый проект и поместим на его главную форму три компонента TTable, три компонента TDataSourse и один компонент TClientDataSet, один компонент TDBGrid и один компонент TDBNavigator (последние два компонента нужны только для контроля и просмотра данных и, по существу, совершенно не обязательны). Установим следующие свойства этих компонентов: 
 
 
Компонент Свойство Значение 
DBGrid1 DataSource DataSource3 
DBNavigator1 DataSource DataSource3 
Table1 DatabaseName BCDEMOS (или DBDEMOS) 
TableName customer.db 
Active true 
DataSource1 DataSet Table1 
Table2 DatabaseName BCDEMOS (или DBDEMOS) 
TableName orders.db 
IndexFieldNames CustNo 
MasterFields CustNo 
MasterSource DataSource1 
Active true 
DataSource2 DataSet Table2 
Table3 DatabaseName BCDEMOS (или DBDEMOS) 
TableName items.db 
IndexFieldNames OrderNo 
MasterFields OrderNo 
MasterSource DataSource2 
Active true 
ClientDataSet1 ProviderName Provider1 
Active true 
DataSource3 DataSet ClientDataSet1 
 
Далее выберем из контекстного меню компонента ClientDataSet1 опцию Assign Local Data и в появившемся списке выберем Table1: 
 
После этого в кэш компонента TCLientDataSet будут загружены данные: 
 
Теперь из контекстного меню этого же компонента выберем опцию Save To File и в появившейся диалоговой панели открытия файла введем имя файла, в котором будут храниться данные из кэша. Итак, файл с данными готов. 
 
Теперь можно создать наше "маленькое" приложение. Для этого достаточно просто удалить с формы компоненты Table1, Table2, Table3, DataSource1, DataSource2 - они больше не нужны. 
 
Есть две возможности создания таких "маленьких" приложений. Самый простой из них - хранить данные непосредственно в исполняемом файле приложения (если их объем невелик). Для этой цели следует из контекстного меню компонента TClientDataSet выбрать опцию Load From File и выбрать имя файла, сохраненного прежде. Теперь данные из этого файла содержатся в ресурсах формы, в чем можно убедиться, открыв форму в текстовом представлении. Если скомпилировать такое приложение, его можно передать пользователю. Единственное, что требуется добавить в комплект поставки - файл dbclient.dll из каталога Winnt\System32 (или Windows\System). 
 
Еще один вариант - выполнить метод LoadFromFile компонента TClientDataSet в обработчике события OnCreate формы. В этом случае файл с кэшированными данными следует также включить в комплект поставки приложения, и объем его может быть достаточно велик (насколько именно - зависит от ресурсов рабочей станции, на которой используется такое приложение). 
 
Отметим, что Delphi 4 и C++Builder 4 позволяют хранить в таком файле данные из нескольких связанных таблиц (именно это и было нами сделано). Поэтому в полученном наборе данных имеется поле типа TDataSetField, предоставляющее доступ к detail-записям (в нашем случае к записям таблиц orders.db и items.db). 
 
Пользователи Delphi 3 и C++Builder 3 могут создавать несколько компонентов TCLientDataSet и организовывать связь между ними в приложении так же, как и в случае обычных таблиц, используя свойства MasterField и MasterSource. 
 
Отметим, что, помимо настольных приложений, сохраненные в файле кэшированные данные могут быть использованы при создании демо-версий и прототипов клиент-серверных приложений, где затруднена или исключена в силу лицензионных ограничений поставка полноценной версии СУБД. 
 
Совет 9. Как сэкономить место на форме при отображении связанных таблиц
В приложениях с базами данных, использующих несколько связанных таблиц, места на форме для их отображения, как правило, не хватает - это общая проблема проектирования интерфейсов подобных приложений. Компонент TCLientDataSet может помочь и в этом случае. 
 
Возьмем наше самое первое приложение, содержащее три компонента TTable и компонент TClientDataSet, и добавим в него компонент TDataSetProvider. Установим значение его свойства DataSet равным Table1. Затем свойство ProviderName компонента ClientDataSet1 установим равным DataSetProvider1. 
 
Теперь наше приложение позволяет редактировать данные из всех трех таблиц, при этом интерфейс приложения окажется примерно тем же, что и на предыдущем рисунке. Единственное, о чем дополнительно следует позаботиться, это о пересылке отредактированных данных обратно в исходные таблицы с помощью метода ApplyUpdates компонента TClientDataSet. Обычно для этой цели к форме добавляют какой-либо интерфейсный элемент, инициирующий выполнение этого метода. Иногда этот метод добавляют к обработчику события AfterPost компонента TClientDataSet. В случае C++Builder этот код имеет вид: 
 
void __fastcall TForm1::ClientDataSet1AfterPost(TDataSet *DataSet)
{
ClientDataSet1->ApplyUpdates(-1);
}
Соответствующий код для Delphi имеет вид:
procedure TForm1.ClientDataSet1AfterPost(DataSet: TDataSet);
begin
 ClientDataSet1.ApplyUpdates(-1);
end;
 
Отметим, однако, что это не самый эффективный способ сохранения отредактированных записей, так как метод Post в данном случае выполняется локально, а метод ApplyUpdates требует обращения к базе данных, и при использовании сетевой СУБД лучше выполнять его не так часто, кaк метод Post. 
------------------------------------------------------------------------------------
 
>Q7: Как руссифицировать Database Desktop 7?
A:   [HKEY_CURRENT_USER\Software\Borland\DBD\7.0\Preferences\Properties]
     "SystemFont"="MS Sans Serif"
A(IU): Ребят, я давно делаю под НТ (под 95 не знаю, не пробовал) такую вещь:
      [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\CodePage]
      "1252"="c_1251.nls"
      И все!!! Помогает 100%. Никаких проблем с "иероглифами" в любых
      программах!
---------------------------------------------------------------------------------------

Категория: 

Оценить: 

5
Средняя: 4.5 (2 оценки)

Добавить комментарий

  _   _    ____    ____   _   _   _  __  __  __ 
| | | | / ___| / ___| | | | | | |/ / | \/ |
| | | | | | | | _ | | | | | ' / | |\/| |
| |_| | | |___ | |_| | | |_| | | . \ | | | |
\___/ \____| \____| \___/ |_|\_\ |_| |_|
Enter the code depicted in ASCII art style.

Похожие публикации по теме