Переносимые
приложения баз данных
В Windows среда Delphi
обеспечивает программисту три пути для доступа к информации, содержащейся в
базах данных;
Эти три метода не применяются
в Kylix. Вместо них вы можете использовать компоненты dbExpress
,
обеспечивающие новую межплатформенную технологию доступа к данным, которая будет
доступна и в Windows при использовании Delphi 6.
Прежде чем перенести приложения
баз данных из Windows в Linux, вы должны понять отличия Между использованием
dbExpress
и механизмом доступа к данным, который вы применяли в
Windows. Эти отличия существуют на нескольких уровнях.
На самом низком уровне
имеется механизм, обеспечивающий связь между вашим приложением и сервером баз
данных. Это может быть клиентская часть программного обеспечения ADO, BDE или
InterBase. Этот слой достаточно легко заменяется dbExpress, который содержит
драйверы для работы с запросами SQL.
На низком уровне вы устанавливаете
на форме компоненты, которые будут использоваться для работы с наборами данных.
Эти компоненты включают компонент соединения с базой данных, который обеспечивает
подключение к серверу базы данных, и компонент набора данных, который представляет
собой выборку данных из таблиц базы данных. Несмотря на то, что имеются некоторые
достаточно важные отличия, они являются наименее заметными на данном уровне.
На уровне интерфейса пользователя
также имеются некоторые отличия. Компоненты CLX, предназначенные для отображения
данных, разработаны таким образом, чтобы по возможности быть наиболее похожими
на соответствующие компоненты Windows.
Рассмотрим эти отличия
более подробно.
Отличия в dbExpress
В Linux dbExpress управляет
соединением с сервером базы данных. dbExpress состоит из набора небольших драйверов,
которые поддерживают набор наиболее используемых интерфейсов. Каждый драйвер
является файлом библиотеки разделяемых объектов (so), который может быть присоединен
к вашему приложению. Так как dbExpress был разработан как межплатформенный набор
драйверов, он доступен
в среде Windows как набор динамически присоединяемых библиотек (dll).
Как и любой другой слой
доступa к данным, dbExpress требует наличия клиентского программного обеспечения,
которое поставляется разработчиком базы данных. dbExpress использует специфичный
для базы данных драйвер и два конфигурационных файла: dbxconnections и dbxdrivers.
Это значительно меньше, чем вам необходимо в BDE, который требует главную библиотеку
Borland Database Engine (Idapi32.dll) плюс специфичный драйвер для базы данных
и несколько других файлов-библиотек для поддержки базы данных.
Ниже перечислены основные
отличия между dbExpress и другими слоями доступа к данным:
INSERT, DELETE
и UPDATE
; Отличия на уровне компонентов
Когда вы создаете приложение,
использующее dbExpress, необходимо применять различные наборы компонентов доступа
к данным.
В табл. 21.7 приведен список
наиболее важных компонентов для работы с базами данных, которые применяются
в InterBase Express, BDE и ADO в среде Windows, и показано их соответствие компонентам
dbExpress для использования в среде Linux и кроссплатформенньк приложениях.
Таблица
21.7. Соответствие компонентов доступа к данным
Компоненты InterBase
Express |
Компоненты BDE |
Компоненты ADO |
Компоненты dbExpress |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Наборы данных dbExpress
(TSQLTable, TSQLQuery, TSQLStoredProc
и TSQLDataSet
)
являются, по сравнению со своими аналогами, более ограниченными, так, они поддерживают
не редактирование данных, а только прямое (одностороннее) перемещение по записям.
Из-за этих недостатков
многие приложения dbExpress не работают напрямую с наборами данных dbExpress.
Чаще всего такие приложения соединяют наборы данных dbExpress с клиентскими
наборами данных, которые размещают записи из таблиц базы данных в памяти и обеспечивают
поддержку редактирования и перемещения по записям.
Примечание
При создании очень простых приложений вы можете воспользоваться компонентом
TSQLClientDataSet
вместо соединения набора данных dbExpress с клиентским. Но для большинства приложений рекомендуется использовать наборы данных dbExpress, соединенные с компонентомTClientDataSet
, представляющим собой клиентский набор данных.
Отличия на уровне интерфейса
пользователя
Как уже было сказано ранее,
компоненты CLX, отображающие данные, разработаны таким образом, чтобы быть наиболее
похожими на соответствующие компоненты Windows.
Главные различия на уровне
интерфейса пользователя возникают из-за отличий способа предоставления данных
между набором данных dbExpress и клиентским набором данных.
Если вы в своем приложении
используете только набор данных dbExpress, то вы должны согласиться с фактом,
что набор данных не поддерживает редактирование и обратное перемещение по записям.
Так, например, вы должны удалить все элементы управления, которые позволяют
пользователю перемещаться на предыдущую запись набора данных. Так как наборы
данных dbExpress не заносят данные в буфер, вы не можете отобразить таблицу
данных (наподобие TDBGrid
). Вы можете отображать на экране только
одну запись в данный момент времени.
Если вы связали набор данных
dbExpress с клиентским набором данных, то элементы интерфейса пользователя,
связанные с редактированием и перемещением по записям, должны работать. Все,
что вам нужно в этом случае — это переключить их на клиентский набор данных.
Главной проблемой будет только вопрос обновления данных, записываемых в базу
данных. По умолчанию большинство наборов данных в Windows записывают обновленные
данные на сервер базы данных автоматически, после их пересылки (например, когда
пользователь перемещается на другую запись таблицы). С другой стороны, клиентские
наборы данных всегда кэшируют все обновления данных в памяти. Для того чтобы
успешно разрешить эту проблему, прочитайте разд. "Обновление данных
в приложениях dbExpress", который представлен далее в этой главе.
Перенос приложений баз
данных в Linux
Перенос готового приложения
базы данных на драйверы dbExpress позволит вам создать межплатформенное приложение,
которое будет работать как под управлением Windows, так и под Linux. Из-за того,
что dbExpress использует другую технологию, вам придется произвести некоторые
изменения в приложении. Трудность переноса приложения из Windows в Linux зависит
от типа используемой в приложении технологии. Наиболее трудными для переноса
являются те приложения, которые применяют специфичные для Windows технологии,
такие как ADO. Наиболее простыми для переноса являются приложения, использующие
технологию Delphi для работы с базами данных.
Осуществите восемь следующих
шагов для переноса приложения из Windows в Linux:
1. Рассмотрите, где располагается
база данных. Технология dbExpress обеспечивает драйверы для работы с базами
данных Oracle, Interbase, DB2 и MySQL. Следовательно, данные должны находиться
на одном из этих SQL-серверов. Если вы использовали другие серверы баз данных,
вам придется преобразовать данные к одному из поддерживаемых типов. Для этого,
если у вас есть Delphi 5 версии Enterprise, вы можете воспользоваться утилитой
Data Pump
, которая поможет преобразовать формат локальных данных
таких платформ, как Paradox, dBase и FoxPro в один из поддерживаемых. (Для подробной
инструкции работы с утилитой смотрите
файл помощи datapump.hlp в каталоге Program Files\Common Files\Borland\Shared\BDE
в Windows).
2. Если у вас в приложении
формы, содержащие интерфейс пользователя, не изолированы от модулей данных,
которые включают в себя компоненты наборов данных и компоненты, обеспечивающие
соединение с сервером базы данных, вы можете захотеть их изолировать, прежде
чем продолжить перенос приложения из одной операционной системы в другую. В
этом случае вам нужно изолировать часть приложения, содержащую модули данных
от интерфейса пользователя. Затем формы интерфейса пользователя можно перенести
в Linux так же, как и любые обычные формы.
Дальнейшие шаги подразумевают,
что вы изолировали компоненты для работы с данными в отдельные модули данных.
3. Создайте новый модуль
данных для хранения компонентов CLX, предназначенных для работы с данными.
4. Для каждого набора данных
оригинального приложения добавьте отдельный набор данных dbExpress, компонент
TDataSetProvider
и компонент TClientDataSet
. Дайте
этим компонентам понятные имена. Установите свойство
ProviderName
компонента TClientDataSet
аналогично
имени компонента TdataSetProvider
и свойство DataSet
компонента TDataSetProvider
в dbExpress. Смените свойство DataSet
во всех компонентах для работы с данными, которые ссылались на оригинальный
набор данных, так, чтобы они ссылались на клиентский набор данных.
5. Установите свойства
нового набора данных в соответствии с оригинальным набором данных:
TTable
,TADOTable
или TIBTable
, задайте свойствоTableName
компонента
TSQLTable
таким же, как и свойство TableName
оригинального набора данных.
Также скопируйте значения всех свойств, используемых для установки типа
связи и определения индексов. Свойства, устанавливающие границы и фильтры,
должны быть установлены в клиентском наборе данных, а не в компоненте TSQLTable
;TQuery, TADOQuery
или TIBQuery
,
установите свойство SQL
компонента TSQLQuery
равным
значению свойства SQL
оригинального набора данных. Задайте
свойство Params
компонента TSQLQuery
в соответствии
со значением свойства Params
или Parameters
оригинального
набора данных. Если вы используете свойство DataSource
для
установки связей, скопируйте его значение тоже;TstoredProc, TADOStoredProc
или
TIBStoredProc
, установите свойство StoredProcName
компонента TSQLStoredProc
равным значению свой-StoredProcName
или ProcedureName
оригинального
набора данных, а свойство Params
компонента TSQLStoredProc
равным значению свойства Params
или Parameters
оригинального набора данных. 6. Для всех компонентов,
предназначенных для соединения с базой данных в oригинальном приложении (TDatabase,
TIBDatabase
или TADOConnection
), добавьте
компонент TSQLConnection
в новый модуль данных. Нужно также добавить
компонент TSQLConnection
для каждого сервера баз данных, с которым
будет осуществляться соединение без использования компонента соединения с базой
данных (например, использующих свойство ConnectionString
в наборе
данных ADO или свойство DatabaseName
в наборе данных BDE).
7. Для каждого набора данных
dbExpress, которые созданы в четвертом шаге, установите их свойства SQLConnection
в значение компонентов TSQLConnection
, соответствующих нужной базе
данных.
8. Для каждого компонента
TSQLConnection
определите информацию, необходимую для установки
связи с базой данных. Для этого щелкните дважды на компоненте TSQLConnection
,
после чего появится редактор соединения (Connection Editor), и установите нужные
значения параметров.
Обновление данных в
приложениях dbExpress
Приложения dbExpress используют
клиентские наборы данных для обеспечения функций редактирования данных. Когда
вы размещаете отредактированные данные в клиентском наборе данных, изменения
записываются в память и не передаются автоматически на сервер базы данных. Если
оригинальное Windows-приложение также использовало кэширование данных в памяти,
вам не потребуется вносить какие-либо изменения в приложение для Linux.
Если оригинальное приложение
не кэшировало данные, вы можете сымити-ровать поведение набора данных Windows
с помощью собственного кода, который будет обновлять данные на сервере всякий
раз после их изменения. Для этого нужно написать обработчик события AfterPost
клиентского набора данных, как показано в листинге 21.5.
Листинг 21.5.Обработчик
события AfterPost
procedure TForm1.ClientDataSetlAfterPost(DataSet:
TDataSet);
begin
with
DataSet as TClientDataSet do
ApplyUpdates(1);
end;