СТАТЬЯ15.05.01

Создание приложений баз данных в Kylix

Новый стандарт производительности

Билл Тод (Bill Todd),
президент The Database Group, Inc.

dbExpress. Новое мировоззрение

Все прошлые попытки создать общий API для многочисленных баз данных имели одну или сразу несколько проблем. Одни были громоздкими, медленными и сложными в использовании потому, что они пытались выполнять слишком много функций. Другие предлагали подход наименьшего общего знаменателя, который лишал разработчиков доступа к специализированным возможностям некоторых баз данных. Некоторые интерфейсы страдали от сложности написания драйверов, тем самым, приводя к ограниченной функциональности, медленной работе драйверов, либо наличию в них ошибок. IDE Kylix от Borland преодолевает эти проблемы путем объединения Borland dbExpress – совершенно нового подхода к обеспечению общего API для множества баз данных, – с испытанной архитектурой провайдер/ресолвер компании Borland, используемой для управления процессом редактирования и обновления данных.

Данный документ рассматривает архитектуру dbExpress и механизм провайдер/ресолвер. Последующие разделы описывают компоненты, которые реализуют стратегию доступа к данным в системе Kylix и проводят вас через этапы создания приложения простой базы данных, демонстрируя предоставляемую ими мощь и продуктивность.

Архитектура dbExpress

dbExpress был разработан для достижения следующих целей:
1. Минимизация размера и использования системных ресурсов.
2. Максимизация скорости.
3. Обеспечение платформенной независимости.
4. Обеспечение простого ввода в действие.
5. Простота разработки драйверов.

Драйверы для dbExpress быстры и невелики по размеру, так как они обеспечивают ограниченную функциональность. Каждый драйвер dbExpress реализует 5 интерфейсов, которые поддерживают выборку метаданных, выполнение операторов SQL и хранимых процедур, а также возвращение однонаправленного указателя с атрибутом “только для чтения”, установленного на результирующее множество. Однако, при использовании совместно с DataSetProvider и ClientDataSet или SQLClientDataSet для реализации стратегии провайд ер/ресолвер доступа к данным компании Borland, dbExpress предоставляет вам полнофункциональную, высокоэффективную систему с высоким параллелизмом выполнения задач для работы с данными в базах SQL.

Как работает архитектура провайдер/ресолвер

Архитектура провайдер/ресолвер использует 4 компонента для обеспечения доступа к данным и их редактирования. Первым является компонент SQLConnection, который обеспечивает связь с драйвером dbExpress для используемой вами базы данных. Следующим является один из компонентов набора данных dbExpress, который предоставляет данные путем исполнения оператора SELECT языка SQL или вызова имеющейся процедуры. Третьим компонентом является DataSetProvider, а четвертым - ClientDataSet. Когда вы открываете ClientDataSet, он запрашивает данные от DataSetProvider. В свою очередь DataSetProvider открывает запрос или имеющийся процедурный компонент, отыскивает записи, закрывает запрос или процедурный компонент и передает отчеты вместе с любыми затребованными метаданными компоненту ClientDataSet. Затем ClientDataSet сохраняет эти записи в памяти, пока они просматриваются или модифицируются. По мере добавления, удаления или обновления записей программным путем или через пользовательский интерфейс ClientDataSet протоколирует все изменения в памяти.

Чтобы обновить базу данных, вам нужно вызвать имеющийся в ClientDataSet метод ApplyUpdates. Метод ApplyUpdates передает протокол изменений компоненту DataSetProvider, который начинает транзакцию, затем генерирует и выполняет операторы SQL для проведения изменений в базе данных. Если все изменения выполнены успешно, DataSetProvider фиксирует транзакцию; либо отменяет ее в противном случае. Обновления базы данных могут потерпеть неудачу, если, например, данное изменение нарушает бизнес-правило, вызванное срабатыванием соответствующего триггера, или если другой пользователь изменил запись, которую вам необходимо модифицировать, после того как вы ее считали. При возникновении ошибки транзакция отменяется и инициируется событие OnReconcileError из компонента ClientDataSet, предоставляя вам контроль над процессом обработки ошибки.

Преимущества архитектуры провайдер/ресолвер

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

Возможность редактирования любых строк
Строки, возвращаемые посредством объединения нескольких таблиц, выполнения хранимых процедур или представлений с атрибутом “только для чтения”, не могут быть отредактированы прямо в приложениях баз данных. Компонент DataSetProvider предоставляет вам три средства для работы в таких ситуациях. Если записи включают поля из единственной таблицы, например записи, возвращенные хранимой процедурой, то единственная проблема состоит в том, что DataSetProvider не имеет никакого способа обнаружить название таблицы. Решением в данном случае является создание обработчика события OnGetTableName для DataSetProvider, который возвращает имя таблицы.

Вторая возможность - объединение нескольких таблиц, при котором должны быть обновлены поля из единственной таблицы. Прежде всего, установите свойство ProviderFlags индивидуальных полей, чтобы определить поля, которые должны быть обновлены. Затем создайте обработчик события OnGetTableName, чтобы возвратить имя таблицы, и DataSetProvider автоматически сгенерирует операторы SQL.

Если вам необходимо обновить несколько таблиц для каждой записи, добавьте обработчик события BeforeUpdateRecord к DataSetProvider. В обработчике события вы можете сгенерировать операторы SQL для каждой таблицы и выполнять их.

Мгновенная сортировка и поиск
Поскольку ClientDataSet держит записи в памяти, их можно быстро сортировать. Если сортировка в памяти окажется слишком медленной, вы можете создать индексы к данным ClientDataSet во время разработки или во время работы приложения. Размещение индексов в памяти позволяет вам изменять порядок обзора записей или почти мгновенно находить их без накладных расходов, связанных с сохранением индексов в базе данных.

Автоматический вывод итоговой информации
ClientDataSets автоматически выполнит определенные вами комплексные итоговые вычисления, такие как Sum(Price) - Sum(Cost). Вы можете группировать итоговые вычисления по полю или комбинации полей для получения групповых итогов. Вы можете также использовать сводные показатели Min, Max, Count и Avg.

Просмотр подмножеств данных
Выражения с фильтрами, использующие синтаксис SQL WHERE, позволяют вам отображать подмножество записи в ClientDataSet без накладных расходов, связанных с выполнением другого запроса к серверу базы данных.

Множественные одновременные представления данных
Возможность клонировать курсор ClientDataSet позволяет вам одновременно представлять различные подмножества данных в ClientDataSet. Также вы можете представлять те же самые данные в различных вариантах сортировки.

Расчет значений полей без накладных расходов
Вы можете добавлять расчетные поля к ClientDataSet во время разработки, чтобы сделать вычисляемые поля частью расположенного в памяти набора данных. Поскольку вычисления выполняются с использованием откомпилированного кода Object Pascal, они производятся быстро и могут быть гораздо более сложными, чем вычисляемые столбцы в инструкции SQL или вычисления, возможные в триггерах. Однако они не обременяют сервер базы данных вычислительными или связанными с хранением данных задачами.

Ограничение, которого здесь нет

Хранение записей в памяти может выглядеть как ограничение числа записей, с которыми можно работать. Однако, принимайте во внимание то, что замыслом традиционного клиент/серверного приложения всегда была выборка небольших наборов записей, чтобы минимизировать сетевой трафик и загрузку сервера базы данных. Даже если вам необходимо работать с необычайно большим количеством записей, помните, что 10000 записей, каждая из которых содержит 100 байтов, требуют всего одного мегабайта памяти. Для того маловероятного случая, когда вам нужно будет работать с очень большим количеством записей, ClientDataSet и DataSetProvider включают свойства и события, которые позволят вам выбирать порцию записей, редактировать, удалять их из памяти, а затем выбирать следующую группу записей.

Простой ввод в действие

Приложение, использующее dbExpress, требует для своего функционирования всего две объектных библиотеки общего пользования. Первой является драйвер dbExpress, например LIBSQLIB.SO в случае InterbaseФ, а второй – библиотека LIBMIDAS.SO, реализующая поддержку компонента ClientDataSet. Это сводит к минимуму размер приложения и упрощает инсталляцию.

Простое создание драйверов

Драйверы dbExpress должны реализовывать всего пять интерфейсов, которые описаны в оперативной системе помощи. Borland также предоставляет в качестве модели исходный код для MySQLФ и Interbase. Это облегчает поставщикам баз данных создание робастных, высокоэффективных драйверов. Вы даже можете создать свой собственный, если вы работаете с необычной или унаследованной базой данных, для которой нет никакого драйвера.

DataCLX

Кросс-платформенная библиотека компонентов, CLX, включает две группы компонентов, обеспечивающих доступ к данным. Компоненты dbExpress обеспечивают базовые функции подключения и поиска данных. Компоненты доступа к данным предоставляют возможность редактирования данных с использованием архитектуры провайдер/ресолвер.

Компоненты dbExpress

Компоненты dbExpress включают компонент SQLConnection, несколько компонентов для работы с данными и компонент SQLMonitor для обеспечения простого доступа к данным через dbExpress. Подобно всем CLX-компонентам, компоненты доступа к данным позволяют вам быстро разрабатывать приложения путем выбора компонентов из палитры и вставки их в ваше приложение.

SQLConnection
SQLConnection обеспечивает подключение к базе данных любого числа компонентов для работы с наборами данных (dataset-компонентов). Вы можете использовать несколько компонентов SQLConnection для одновременного соединения с несколькими базами данных. Существуют три способа определения подключения к базе данных. Вы можете использовать существующее именованное соединение, создать новое именованное подключение или поместить параметры подключения в свойство Params компонента SQLConnection. Чтобы использовать существующее именованное соединение, просто установите свойство ConnectionName.

Редактор dbExpress Connection
Чтобы создать новое именованное соединение дважды щелкните по компоненту SQLConnection для запуска редактора dbExpress Connection Editor. Окно Connection Name со списком имен соединений слева показывает все соединения, которые уже определены. Ниспадающий список Driver позволяет вам отфильтровать имена соединений (Connection Names), чтобы показать только соединения для выбранного вами драйвера. Таблица Connection Settings справа отображает настройки выбранного соединения. Все соединения, которые вы создаете, сохраняются в файле dbxconnections.conf. Сопутствующее окно представляет файл соединений с записями для подключения к MySQL и Interbase.

Файл соединений
После создания именованного соединения вы можете указать его в свойстве ConnectionName компонента SQLConnection. Если вы используете именованные соединения, то необходимо будет распространить файл соединений с помощью вашего приложения или найти существующий файл на целевом компьютере и добавить к нему ваше соединение.

Альтернативное решение состоит в том, чтобы начать с установки свойства DriverName компонента SQLConnection. Ниспадающее окно свойства DriverName отображает перечень всех установленных в вашей системе драйверов. Информация о драйвере содержится в файле dbxdrivers.conf. Установка свойства DriverName также установит свойства LibraryName и VendorLib, используя информацию из файла драйверов. LibraryName содержит имя файла объектов общего пользования драйвера dbExpress, а VendorLib содержит имя клиентского библиотечного файла поставщика базы данных.

Свойство Params компонента SQLConnection
Введите параметры соединения из редактора Connections Editor в свойстве Params компонента SQLConnection, как показано на предшествующем рисунке. При использовании этого метода информация о соединении полностью содержится внутри вашего приложения. Если вы хотите, чтобы пользователи приложения могли изменять любые параметры соединения, то можно сохранить их в собственном конфигурационном файле приложения и обеспечить способ редактирования этого файла вашим приложением или с помощью отдельной конфигурационной программы. Это делает каждое приложение полностью самодостаточным.

Компонент SQLConnection также предоставляет методы StartTransaction, Commit и Rollback для явного управления транзакциями. Если вам необходимо выполнить инструкции SQL, которые не возвращают результирующее множество, вы можете сделать это через компонент SQLConnection, используя методы Execute или ExecuteDirect. При этом не требуется никаких dataset-компонентов. Если вам нужен доступ к метаданным из базы данных, с которой вы работаете, SQLConnection предоставляет методы GetTableNames, GetFieldNames и GetIndexNames.

Компоненты для работы с наборами данных
dbExpress предоставляет 4 компонента для работы с наборами данных (dataset-компоненты): SQLDataSet, SQLQuery, SQLStoredProc и SQLTable. SQLDataSet является предпочтительным компонентом для любого нового приложения, которое вы пишете. Путем установки свойства CommandType вы можете использовать его для выполнения инструкций SQL, вызывать хранимые процедуры или получать доступ ко всем строкам и столбцам таблицы. Другие компоненты для работы с наборами данных предоставлены, главным образом, для облегчения конвертации приложений WindowsТ, использующих Borland Database Engine, в dbExpress.

Чтобы использовать SQLDataSet, установите его свойство SQLConnection на тот компонент SQLConnection, который вы хотите использовать. Затем установите свойство CommandType в значение ctQuery, ctStoredProc или ctTable. Чаще всего вы будете использовать значение по умолчанию ctQuery. Значение свойства CommandText зависит от значения CommandType. Если CommandType установлено в ctQuery, то CommandText содержит инструкцию SQL, которую вы хотите выполнить. Если CommandType имеет значение ctStoredProc, то CommandText является именем хранимой процедуры. Если CommandType имеет значение ctTable, то CommandText является именем таблицы. Свойство Params используется для передачи параметров в параметрический запрос или хранимую процедуру, а свойство DataSource - для обеспечения связи SQLDataSet с другим dataset-компонентом для работы с master-detail (главный-подчиненный) наборами данных.

SQLDataSet предоставляет только однонаправленный курсор с атрибутом «только для чтения». Если это - единственный тип доступа, который вам нужен (например для печати отчета), то вы можете использовать SQLDataSet отдельно или с компонентом DataSource, в зависимости от требований вашего генератора отчетов. Если вам нужно листать записи вперед и назад или редактировать данные, просто добавьте DataSetProvider и ClientDataSet, как описывается далее.

Если вы нуждаетесь в более подробной информации о метаданных, чем предоставляют методы компонента SQLConnection, используйте метод SetSchemaInfo из компонента SQLDataSet. Метод SetSchemaInfo требует 3 параметра: SchemaType, SchemaObject и SchemaPattern. SchemaType может иметь значения stNone, stTables, stSysTables, stProcedures, stColumns, stProcedureParams или stIndexes. Этот параметр указывает тип информации, которую будет содержать SQLDataSet при открытии. Тип схемы устанавливается в значение stNone, когда вы выбираете данные из таблицы, используя инструкцию SQL или хранимую процедуру. Каждый из остальных типов схем создает набор данных со структурой, соответствующей возвращаемой информации. SchemaObject является именем хранимой процедуры или таблицы, когда это имя требуется. Схемный шаблон позволяет вам получить шаблон SQL, который будет фильтровать результирующее множество. Например, если SchemaType имеет значение stTables, а SchemaPattern установлено в ‘EMP%’, то набор данных будет содержать только таблицы, имена которых начинаются с EMP.

SQLMonitor
Последний компонент dbExpress, SQLMonitor, предоставлен для облегчения отладки вашего приложения. SQLMonitor отслеживает все инструкции SQL, проходящие между компонентом SQLConnection и сервером базы данных, к которому он подключен. Инструкции SQL могут протоколироваться в файл, либо можно написать обработчики событий, чтобы обрабатывать их так, как вам хочется.

Компоненты доступа к данным.

DataSetProvider
DataSetProvider привязывается через свое свойство DataSet к одному из dataset-компонентов dbExpress. DataSetProvider по запросу предоставляет данные компоненту ClientDataSet и генерирует инструкции SQL DML для обновления базы данных на основе протокола изменений, выдаваемого компонентом ClientDataSet.

ClientDataSet
Компонент ClientDataSet связывается с DataSetProvider через свое свойство ProviderName. Он принимает данные от своего DataSetProvider, буферизует данные в памяти, протоколирует все изменения и посылает изменения к DataSetProvider при вызове имеющегося в ClientDataSet метода ApplyUpdates.

DataSource
Компонент DataSource связывается с набором данных через свое свойство DataSet. Этим набором данных может быть ClientDataSet или один из dataset-компонентов dbExpress. DataSource предоставляет общую функциональность и точку стыковки для предоставляющих данные компонентов пользовательского интерфейса, используемых для отображения и редактирования данных в интерактивном режиме. Он также используется для связи dataset-компонентов с целью моделирования отношений по схемам « один-ко- многим» или «один-к-одному».

SQLClientDataSet
Этот компонент представляет собой ClientDataSet со встроенными DataSetProvider и SQLDataSet. Просто подключите его к компоненту SQLConnection, установите свойства DataSet, CommandType и CommandText, и все готово. Несмотря на то, что SQLClientDataSet скрывает некоторые из наиболее редко используемых функций компонентов SQLDataSet и DataSetProvider, он экономит время разработки и предоставляет все функциональные возможности, которые обычно необходимы для доступа к данным из единственной таблицы.

MyBase – локальная база данных XML

Содержащиеся в ClientDataSet данные могут быть сохранены или загружены как дисковый файл в двоичном, либо в XML формате. Это позволяет ClientDataSet функционировать как однопользовательская система реляционной базы данных. Единственное ограничение заключается в том, что данные должны помещаться в память во время осуществления доступа.

Эта возможность может использоваться разнообразными способами. Она позволяет вам создавать приложения в соответствии с моделью «портфеля», при которой пользователь портативного ПК выбирает данные из сервера базы данных и сохраняет их локально. Затем пользователь отсоединяется от сети, вставляет, удаляет и обновляет записи; потом сохраняет данные и протокол изменений, снова подключается к сети и выполняет обновления в базе данных. Вы можете также использовать эту возможность для импорта/экспорта данных в XML. Наконец, вы можете использовать ClientDataSet в качестве высокоэффективной временной, хранящейся в памяти таблицы, которая может создаваться и ликвидироваться «на лету».

Создание приложения базы данных

Настоящей мощью dbExpress и DataCLXФ является скорость, с которой вы можете создавать сложные приложения баз данных. Рассмотрим простое приложение, которое позволяет пользователям просматривать и редактировать отношение типа «один-ко-многим» между департаментами и служащими и рассматривать список всех сотрудников в убывающем порядке по рангу службы. Следующий экран иллюстрирует модуль данных, который содержит требуемые компоненты. Следующие параграфы описывают шаги, которые вам будет необходимо проделать, чтобы построить такое приложение.

Начните с нового проекта Kylix, затем выберите из меню пункт File | New и дважды щелкните по вкладке Data Module в Object Repository, чтобы добавить модуль данных в ваш проект.

Соединение с базой данных

После появления компонента SQLConnection в верхнем левом углу модуля данных щелкните правой кнопкой мыши и выберите Edit Connection Properties. Добавьте новое соединение, выберите драйвер для вашей базы данных, установите путь к базе данных и любые другие свойства, значения которых вам необходимо изменить вместо значений "по умолчанию". Свойству Name присвойте значение sconEmployee.

Добавление DataSet-компонентов

Добавьте два компонента SQLDataSet к модулю данных. В них обоих присвойте свойству SQLConnection значение sconEmployee. Свойство Name первого компонента установите в значение sdsDepatement, а его свойство SQL – в значение SELECT * FROM DEPARTMENT. Добавьте компонент DataSource, установите в нем Name в значение srcDeptLink, а его свойство DataSet – в значение sdsDepartment, чтобы соединить его с sdsDepartment SQLDataSet. Выберите второй SQLDataSet, установите его имя в значение sdsEmployee, а свойство SQL в значение SELECT * FROM EMPLOYEE WHERE DEPT_NO = :DEPT_NO. Затем, назначьте свойству DataSource значение srcDeptLink. Это предписывает набору данных sdsEmployee получить значение параметра DEPT_NO из поля DEPT_NO текущей записи в sdsDepartment.

Добавьте один компонент DataSetProvider, определите его имя как provDepartment, а его DataSet как sdsDepartment. Добавьте два компонента ClientDataSet. Назовите первый cdsDepartment, а второй - cdsEmployee. Выберите cdsDepartment и присвойте свойству ProviderName значение provDepartment. Щелкните правой кнопкой по cdsDepartment, выберите Fields Editor, затем щелкните правой кнопкой на редакторе Fields Editor и выберите Add All Fields. Заметьте, что последнее поле называется sdsEmployee. Это - поле сгруппированного набора данных, и оно содержит записи сотрудников вместо записи департамента. Теперь выберите cdsEmployee и установите свойство DataSetField в значение sdsEmployee так, что оно отобразит данные из поля sdsEmployee.

Затем добавьте в модуль данных два компонента DataSource и назовите их srcDepartment и srcEmployee. Свойство DataSet компонента srcDepartment установите в значение cdsDepartment, а свойство DataSet компонента srcEmployee – в значение cdsEmployee. Все компоненты для реализации отношения типа "один-ко-многим" между Department (департаментом) и Employee (служащим) теперь находятся на своем месте.

Просмотр всех служащих

Следующий шаг состоит в добавлении компонентов, которые обеспечат просмотр всех записей служащих. Разверните вкладку SQLClientDataSet на модуле данных и установите его свойство Name в значение scdsEmpAll, свойство DBConnection - в значение sconEmployee, а свойство CommandText – в значение SELECT * FROM EMPLOYEE ORDER BY JOB_GRADE DESC. Поскольку пользователи не смогут отредактировать это окно просмотра набора данных, установите свойство ReadOnly в значение true.

Добавьте компонент DataSource, назовите его srcEmpAll и присвойте свойству DataSet значение scdsEmpAll. Это – все, что нужно с ним сделать. Так как этот набор данных не связан с другим, вы можете воспользоваться преимуществом использования SQLClientDataSet, который объединяет SQLDataSet, DataSetProvider и ClientDataSet в единственном компоненте.

Обработка ошибок

Самым простым способом обработки ошибок обновления базы данных является использование диалога урегулирования ошибок Reconcile Error Dialog из базы объектов Object Repository. Выберите из меню File | New, щелкните по ярлыку Dialogs, затем дважды щелкните по Reconcile Error Dialog, чтобы добавить его в свой проект. Щелкните по кнопке Save на панели инструментов и сохраните новый единичный файл как RecErrF.pas.

Добавление кода

Щелкните по открытой области модуля данных, затем щелкните по ярлыку Events в Object InspectorФ. Дважды щелкните окно редактирования события OnCreate для создания оболочки процедуры обработки ошибки и добавьте туда следующие три строки кода, чтобы открыть три компонента ClientDataSet:

Выберите пункт File | Use Unit из меню, а затем модуль RecErrF. Это позволяет вам вызывать методы, имеющиеся в Reconcile Error Dialog. Выберите cdsDepartment ClientDataSet и дважды щелкните по области редактирования события OnReconcileError. Добавьте в процедуру обработки события следующей строки:
Action := HandleReconcileError(DataSet, UpdateKind, E);

Повторите этот процесс для dsEmployee ClientDataSet. Этот код вызовет диалог Reconcile Error Dialog в случае возникновения ошибки при выполнении обновлений базы данных.

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

Чтобы сформировать интерфейс пользователя, показанный выше, начните с размещения PageControl на форме и установки его свойства Align в значение alClient. Щелкните правой кнопкой по PageControl и дважды выберите New Page, чтобы добавить два TabSheets к PageControl. Выберите первый TabSheet и его свойству Caption присвойте значение Employees By Dept. Выберите второй TabSheet и установите его свойство Caption в значение All Employees.

Вернитесь к первому TabSheet со значением Employees By Dept и добавьте элементы Button, DBNavigator, DBGrid, еще один DBNavigator и второй DBGrid. Выберите File | Use Unit, а затем модуль данных. Щелкните по первому элементу DBNavigator, чтобы выбрать его, а затем, удерживая клавишу shift, щелкните по первому DBGrid, чтобы оба элемента оказались выделенными. В Object Inspector установите свойства DataSource в значение srcDepartment. Выделите вторую пару DBNavigator и DBGrid и установите их свойства DataSource в значение srcEmployee.

Добавление кода для выполнения обновлений

Выберите элемент Button и присвойте его свойству Caption значение Apply Updates. Дважды щелкните по кнопке, чтобы создать для нее обработчик события OnClick и добавьте следующий код:
with dmMain.cdsDepartment do
begin
if ChangeCount > 0 then
ApplyUpdates(0);
end;

Этот код проверяет свойство ChangeCount компонента ClientDataSet, чтобы обнаружить изменения, которые нужно внести в базу. Если такие изменения имеются, вызывается метод ApplyUpdates из компонента ClientDataSet. Указанный параметр указывает количество ошибок, которое допускается перед остановкой процесса обновления.

Важно отметить, что вам не нужно вызывать метод ApplyUpdates из компонента cdsEmployee. Так как записи служащих встроены в ClientDataSet, обслуживающий таблицы департаментов, его DataSetProvider обрабатывает обновления в обеих таблицах. Он также корректно управляет целостностью данных на уровне ссылок путем внесения модификаций сначала в таблицу департаментов, а затем в таблицу служащих, в то время как удаления выполняются сначала в таблице служащих, а затем в таблице департаментов.

Что это означает?

Показательным свойством этого приложения является не то, что оно делает, а скорее то, что разработчик на Kylix, обладающий умеренным опытом, может создать законченное клиент/серверное приложение базы данных менее чем за 30 минут. Это является значительным увеличением продуктивности программиста для LinuxТ.

Об авторе: Билл Тод (Bill Todd) является президентом компании The Database Group, Inc., - консалтинговой и внедренческой фирмы, специализирующейся в области баз данных и базирующейся неподалеку от Феникса (США). Он является соавтором 4-х книг по программированию баз данных, автором более 80 статей, а также членом Team Borland, - группы разработчиков, которая обеспечивает техническую поддержку в группах новостей Borland Internet. Он часто выступает на конференциях разработчиков Borland Developer Conferences в США и Европе. Билл является также известным в масштабе всей страны инструктором - он преподавал курсы программирования в Delphi по всей стране и за границей.


Подробно о Kylix
Ознакомительная версия Kylix
Обратиться в отдел продаж Interface Ltd.

За дополнительной информацией обращайтесь в Interface Ltd.

Отправить ссылку на страницу по e-mail
Обсудить на форуме Borland


Interface Ltd.
Тel/Fax: +7(095) 105-0049 (многоканальный)
Отправить E-Mail
http://www.interface.ru
Ваши замечания и предложения отправляйте автору
По техническим вопросам обращайтесь к вебмастеру
Документ опубликован: 15.05.01