
- •Практический раздел содержание
- •Лабораторная работа №1
- •Основные понятия диаграмм классов uml
- •Классы, атрибуты, операции
- •Категории связей. Связь-зависимость
- •Связи-обобщения и механизм наследования классов в uml
- •Связи-ассоциации: роли, кратность, агрегация
- •Получение схемы реляционной базы данных из диаграммы классов uml
- •Лабораторная работа №2
- •Лабораторная работа №3
- •Лабораторная работа №4
- •Лабораторная работа №5
- •Лабораторная работа №6
- •3Апрос 6-2-1
- •3Апрос 6-2-2
- •Лабораторная работа №7
- •Лабораторная работа №8
- •Создание макроса
- •Сведения о построителе макросов
- •Создание изолированного макроса
- •Создание группы макросов
- •Создание внедренного макроса
- •Изменение макроса
- •Использование условий для контроля за действиями макроса
- •Примеры условных выражений в макросах
- •Лабораторная работа №9
- •Описание
- •Порядок обработки элементов оператора select:
- •Конструкция where
- •Конструкция group by
- •Конструкция having
- •Конструкция order by
- •Seller (Продавцы)
- •Sale (Продажи)
- •Supplier (Поставщики)
- •Goods (Товары)
- •Model (Модели)
- •Custom (Заказ)
- •Простые запросы
- •Агрегатные функции
- •Лабораторная работа №10
- •Многотабличные запросы
- •Примеры многотабличных запросов
- •Подзапросы и многотабличные запросы
- •Лабораторная работа №11
- •Операторы манипулирования данными
- •Лабораторная работа №12
- •Лабораторная работа №13
- •Примеры
- •Синтаксис
- •Примеры
- •Лабораторная работа №14
- •Лабораторная работа №15
- •Лабораторная работа №16
- •Лабораторная работа №17
- •Лабораторная работа №18
- •Лабораторная работа №19
- •Работа с данными
- •Состояния и режимы набора данных
- •Поля и класс tField
- •Типы полей и типы данных
- •Сортировка
- •Навигация
- •Фильтрация
- •Редактирование
- •Добавление и удаление
- •Лабораторная работа №20
- •Лабораторная работа №21
- •Лабораторная работа №22
- •Лабораторная работа №23
- •Компонент dbCtrlGrid
- •Лабораторная работа №24
- •Импорт информации из Delphi в Word
- •1. Как определить установлен ли Excel
- •2. Как определить запущен ли Excel
- •3. Как вывести данные в Excel
- •Лабораторная работа №25
- •Поиск и фильтрация данных в Delphi
- •Общие положения
- •Поиск данных
- •Лабораторная работа №26
- •Лабораторная работа №27
- •Отчеты в Delphi
- •Лабораторная работа №28
- •Лабораторная работа №29
- •Лабораторная работа №30
- •Лабораторная работа №31
- •Лабораторная работа №32
- •Стандартные функции php для работы с MySql
- •Пример простейшей поисковой системы на php
- •Сортировка таблиц
- •Лабораторная работа №33
- •Работа с соединениями
- •Постоянные соединения с базами данных
- •Лабораторная работа №34
- •Создание бд и таблиц
- •Создание бд и таблиц с помощью php
- •Создание бд и таблиц с использованием phpMyAdmin
- •Лабораторная работа №35
- •Лабораторная работа №36
- •Применение информации о структуре таблицы
- •Лабораторная работа №37
- •Лабораторная работа №39
- •Роль сервера приложений: Настройка сервера приложений
- •Предварительная подготовка
- •Настройка сервера приложений
- •Параметры сервера приложений
- •Сводка выбранных параметров
- •Завершение работы мастера настройки сервера
- •Удаление роли сервера приложений
- •Дальнейшие действия: выполнение дополнительных задач
- •Подготовка данных для сервера приложений
- •Создание сервера приложений
- •Лабораторная работа №40
- •Создание локального клиентского приложения (на том же пк, что и сервер)
- •Удаленный клиент с использованием olEnterprise
- •Об удаленном клиенте с использованием dcom
- •Удаленный клиент с использованием ActiveForm
Лабораторная работа №30
Тема: Разработка приложений с использованием технологии доступа к данным dbExpress
Цель работы: Изучить особенности использование технологии доступа к данным dbExpress.
Время работы: 2 учебных часа.
Правила по ТБ: Общие.
Оборудование рабочего места: Практикум, ПК.
Программное обеспечение: Windows, MS Office, Delphi
Вопросы входного контроля:
Расскажите, какие компоненты необходимы для использования технологии InterBase Express.
Расскажите, как подключать компоненты использования технологии InterBase Express.
Перечислите все компоненты, которые могут использоваться в технологии InterBase Express.
Охарактеризуйте некоторые методы и свойства компонентов для использования технологии InterBase Express.
Перечислите наиболее часто используемые компоненты для работы с БД.
КРАТКИЕ ТЕОРЕТИЧЕСКИЕ СВЕДЕНИЯ
Какие преимущества технологии dbExpress
Данная технология обладает следующими важными преимуществами:
Средства dbExpress гораздо проще с точки зрения установки и компактнее по сравнению с их предшественником BDE;
Технология dbExpress является межплатформенной, которая может работать как в Windows (Delphi), так и в Linux (Kylix);
Для dbExpress можно создавать новые драйвера. При этом достаточно реализовать опубликованные интерфейсы и разработать библиотеку, обладающую методами доступа к базе данных.
Какие отличия dbExpress от остальных механизмов доступа к данным, и в первую очередь от BDE
dbExpress обеспечивает более простой и быстрый доступ к удаленным БД благодаря использованию однонаправленных наборов данных;
Так же, как и BDE, dbExpress обрабатывает пользовательские запросы и хранимые процедуры, однако понятие открытия таблицы базы данных в новом механизме отсутствует (в BDE открытие таблицы БД не только занимало большую часть ресурсов на стороне клиента, но и блокировало ресурсы сервера);
В отличие от BDE, dbExpress возвращает только однонаправленные наборы данных, не подлежащие редактированию. Для кэширования, фильтрации записей и индексирования возвращаемого множества записей, а также для навигации по нему необходимо использовать дополнительные компоненты, например ClientDataSet;
BDE кэширует метаданные, делая их доступными в последующих запросах. dbExpress этого не делает, а работа с метаданными на этапе проектирования осуществляется с использованием основного механизма доступа к данным;
При работе с удаленными SQL-базами данных через BDE время обращения к базе данных увеличивается за счет выполнения внутренних запросов, обеспечивающих навигацию по таблицам, доступ к BLOB-объектам и получение метаданных. dbExpress выполняет только запросы пользователей, отсутствие дополнительных операций помогает оптимизировать доступ к БД;
dbExpress управляет буфером записей с помощью внутренних механизмов, тогда как BDE требует, чтобы клиентская часть приложения выделяла память для хранения записей. Использование клиентского буфера может вызвать ошибку, если клиент выделит недостаточно памяти для хранения данных;
dbExpress не поддерживает локальные базы данных типа Paradox, dBase или FoxPro. Borland рекомендует перейти к использованию СУБД InterBase. Также можно воспользоваться драйверами сторонних производителей;
dbExpress содержит драйверы для таких СУБД, как InterBase, Oracle, DB2, Informix, MSSQL и MySQL. Для использования других серверов существует три возможности: перенос данных в формат одной из поддерживаемых СУБД, написание собственного драйвера или же использование драйверов сторонних разработчиков для работы с вашей СУБД.
Что такое однонаправленный набор данных
Суть однонаправленных наборов данных заключается в том, что они не буферизируют данные при навигации или модификации. В отличии от используемых в BDE двунаправленных наборов данных с буферизацией в оперативной памяти, однонаправленные наборы отличаются большей эффективностью, но обладают и некоторыми ограничениями:
Однонаправленные наборы данных обладают всего лишь двумя навигационными методами: First() и Next(). Попытка вызова иных методов, например Last() или Prior(), приведет к исключению. Такое ограничение не удивительно, так как многие СУБД поддерживают лишь однонаправленные курсоры. Некоторые, методы такие как работа с закладками (Bookmarks), представляют собой просто заглушки;
Данные однонаправленных наборов нельзя редактировать, поскольку для них не выделяется буфер, пригодный для редактирования. Свойство CanModify всегда равно False, и попытки перевода датасета в режим редактирования всегда приводят к неудаче. Данная возможность полезна, при формировании отчетов. Редактирование данных, однако, может осуществляться с помощью SQL команды UPDATE или используя архитектуру provider/resolver (компоненты TSimpleDataSet или TDataSetProvider/TClientDataSet);
Однонаправленные наборы данных не поддерживают фильтрацию, поскольку отсутствие буфера не позволяет создавать набор для нескольких записей. При попытке фильтрации вызывается исключение. Все ограничения на диапазон выбираемых записей должны содержаться в SQL команде;
Однонаправленные наборы данных не поддерживают подстановочные (lookup) поля, т.к при этом необходимо буферизировать возможные значения такого поля.
Что такое provider/resolver
Это механизм, который отвечает за выдачу данных по запросу пользователя и проведение изменений в базе данных. Данный механизм состоит из двух частей:
Провайдер. Эта часть отвечает за выборку данных из массива по запросу пользователя, передачу их пользователю вместе с нужными метаданными и хранение их в памяти на время работы с ними, а также ведет протокол изменений переданных пользователю записей;
Ресолвер. Эта часть обеспечивает внесение изменений в базу данных. При обновлении базы данных серверу передается протокол изменений, в соответствии с которым начинается транзакция, и проводятся изменения в БД.
Какие преимущества использования механизма provider/resolver
Короткое время жизни транзакций
Долгие транзакции заставляют сервер БД удерживать блокировки, которые снижают возможности многопользовательской обработки данных и отнимают ресурсы сервера. При архитектуре provider/resolver, транзакция существует только в момент, когда применяются обновления. Таким образом снижается требование к ресурсам и уменьшается вероятность блокировок, особенно при большом количестве пользователей сервера БД;
Дает возможность редактировать любые записи
Записи, возвращаемые многотабличными выборками, хранимыми процедурами или нередактируемыми view не могут быть изменены напрямую. Но имеется возможность указать при помощи свойства ProviderFlags у объектов TField, какие столбцы должны обновляться, а в событии DataSetProvider.OnGetTableName - какая именно таблица должна обновляться. Или написать обработчик события BeforeUpdateRecord, с установкой Applied := True. При этом большинство нередактируемых данных станут редактируемыми;
Быстрая сортировка и поиск
Поскольку ClientDataSet хранит записи в памяти, они могут быть быстро отсортированы. Для повышения скорости сортировки или поиска, можно создать индексы над данными ClientDataSet либо во время разработки, либо во время выполнения приложения;
Автоматическое агрегирование
ClientDataSet может производить сложные вычисления, такие как Sum(Price) -Sum(Cost). Также можно группировать вычисления сумм по полю или комбинации полей. Доступные агрегаты Sum, Min, Max, Count и Avg;
Просмотр подмножества данных
Выражения фильтрации могут использовать синтаксис WHERE для отображения подмножества записей ClientDataSet, без необходимости конструировать запрос на клиенте и отправлять его каждый раз на сервер;
Множество видов данных
Возможность "клонировать" курсор ClientDataSet (метод CloneCursor) позволяет просматривать одни и те же данные различными способами, одновременно. Например, можно просматривать одни и те же данные, отсортированные по разным столбцам;
Вычисляемые столбцы на клиенте
Также имеется возможность добавлять вычисляемые столбцы к ClientDataSet во время разработки. Поскольку вычисления производятся скомпилированным Delphi кодом, они выполняются очень быстро и могут быть более сложными, чем вычисления, производимые на сервере;
Ограничение, которого нет
Может показаться, что у хранения записей в памяти есть ограничение по количеству таких записей, с которыми можно работать. Но обычно приложения разрабатываются таким образом, чтобы выбирать небольшой объем данных для минимизации сетевого трафика и загрузки сервера БД. Даже если нужно работать с необычно большим количеством записей, помните что 10 тысяч записей, каждая по 100 байт, занимают 1 мегабайт памяти. В случаях, когда объем данных действительно большой, компоненты ClientDataSet и DataSetProvider имеют свойства и события, которые позволяют выбирать часть записей, редактировать их, удалять из памяти и затем получать новую порцию записей.
Соответствие компонентов доступа к базам данных, различных технологий
InterBase Express |
ADO |
BDE |
dbExpress |
Комментарий |
TIBDatabase |
TADOConnection |
TDatabase |
TSQLConnection |
Установление соединения с БД. |
TIBTable |
TADOTable |
TTable |
TSQLTable |
Однонаправленный не редактируемый набор данных. |
TIBQuery |
TADOQuery |
TQuery |
TSQLQuery |
Однонаправленный не редактируемый набор данных. |
TIBStoredProc |
TADOStoredProc |
TStoredProc |
TSQLStoredProc |
Однонаправленный не редактируемый набор данных. |
TIBDataSet |
TADODataSet |
нет аналога |
TSQLDataSet |
TSQLDataSet объединяет в себе возможности компонентов SQLTable, SQLQuery и SQLStoredProcedure. |
TIBSQLMonitor |
нет аналога |
утилита SQL Monitor |
TSQLMonitor |
Отслеживает все инструкции SQL, проходящие между компонентом SQLConnection и сервером базы данных, к которому он подключен. |
нет аналога |
нет аналога |
TBDEClientDataSet |
TSimpleDataSet |
Используется при разработке 2-ух уровневых приложений. Является комбинацией SQLDataSet, DataSetProvider, ClientDataSet и позволяет читать и редактировать данные. |
нет аналога |
нет аналога |
TBatchMove |
нет аналога |
При необходимости, придется повторить данную функциональность. |
&hbsp; |
|
TSession |
нет аналога |
Механизм TSession в технологии dbExpress не нужен. |
|
|
TUpdateSQL |
нет аналога |
Возможности TClientDataSet заменяют механизм CachedUpdates. |
|
|
TNestedDataSet |
нет аналога |
Возможность обработки вложенных наборов данных встроена в TDataSetProvider и TClientDataSet. |
Что такое Borland MyBase
Данные содержащиеся в ClientDataSet могут быть сохранены или загружены как дисковый файл в двоичном, либо в XML формате. Это позволяет ClientDataSet функционировать как однопользовательская система реляционной базы данных. Данную возможность можно использовать следующим образом:
Создавать приложения в соответствии с моделью "портфеля", при которой пользователь портативного ПК выбирает данные из сервера базы данных и сохраняет их локально. Затем пользователь отсоединяется от сети, вставляет, удаляет и обновляет записи; потом сохраняет данные и протокол изменений, снова подключается к сети и выполняет обновления в базе данных;
Использовать для импорта/экспорта данных в XML;
Использовать в качестве временной, хранящейся в памяти таблицы, которая может создаваться и ликвидироваться «на лету».
Недостатки:
Данные должны быть размещены в памяти во время осуществления доступа;
В предыдущих версиях Delphi (на Delphi7 - не знаю), импорт/экспорт данных в XML формате, вызывал небольшую утечку памяти.
В некоторых примерах, имеются упоминания о компоненте TSQLClientDataSet, но Delphi7 и Help его не находят
В Delphi7 данный компонент, не рекомендуется к использованию, он заменен на TSimpleDataSet. Для поддержки старых приложений, исходники компонента TSQLClientDataSet размещены в каталоге "...\Demos\Db\SQLClientDataset".
Для чего нужен компонент TSimpleDataSet
Данный компонент появился в Delphi7, как замена TSQLClientDataSet. Он комбинирует в себе TSQLDataSet, TDataSetProvider и TClientDataSet и является простой заменой TQuery при переходу с BDE на dbExpress. Также экономится время в процессе разработки, так как вместо трех компонент используется один. Однако данный компонент имеет недостатки:
Не поддерживает многозвенные приложения;
Невозможно подключить дочерний TDataSet для получения вложенных наборов данных;
События встроенного TDataSetProvider не экспортированы;
Свойство Options встроенного TDataSetProvider не экспортировано. Нет возможности устанавливать параметры провайдера во время разработки или выполнения;
Если используется только Borland MyBase (база данных встроенная в TClientDataSet), то лучше использовать ClientDataSet отдельно, для уменьшения используемых ресурсов;
Свойства и методы встроенного TSQLDataSet не эквивалентны свойствам TQuery. Поэтому использование TSimpleDataSet при переносе проектов с BDE могут потребовать больше изменений в коде.
Как обойти недостатки компонента TSimpleDataSet
Необходимо разместить компоненты TSQLQuery, TDataSetProvider и TClientDataSet на форму или модуль данных. Установить свойство DataSetProvider.DataSet на SQLQuery, ProviderName на ClientDataSet. Выбрать все три компонента, и в главном меню среды выбрать - Component | Create Component Template. Указать имя класса, компонента и палитры для нового шаблона. Теперь можно использовать три компонента так же легко как один компонент TSimpleDataSet.
Как управлять транзакциями
Класс TSQLConnection имеют методы StartTransaction, Commit, Rollback и позволяет работать с несколькими транзакциями, активными в один и тот же момент. Для поддержки такого режима методы StartTransaction, Commit и Rollback принимают параметр TTransactionDesc, объявленный следующим образом:
TTransactionDesc = packed record
TransactionID : longword;
GlobalID : longword;
IsolationLevel : TTransactionIsolationLevel;
CustomIsolation: longword;
end;
Для каждой отдельной транзакции необходим объявить переменную типа TTransactionDesc и установить TransactionId в число, которое должно быть уникально между всеми активными транзакциями. Поле GlobalId используется только в Oracle для распределенных транзакций. IsolationLevel может быть xilDirtyRead, xilReadCommitted или xilRepeatableRead. Поле CustomIsolation пока не поддерживается.
Пример:
var T: TTransactionDesc; begin T.TransactionID := 1; T.IsolationLevel := xilREADCOMMITTED; SQLConnection.StartTransaction(T); end;
Для обеспечения одного из главных достоинств dbExpress - короткое время жизни транзакции, необходимо придерживаться следующей схемы:
Пользователь редактирует данные в ClientDataSet;
Старт транзакции;
Вызов ApplyUpdates;
Commit или Rollback.
Как управлять загрузкой параметров подключения во время выполнения приложения
Для загрузки значений параметров подключения во время выполнения приложения необходимо присвоить значение True свойству LoadParamsOnConnect. При загрузке приложения компонент класса TSQLConnection определяет размещение файла dbxconnections.ini на основании содержимого ключа системного реестра Connection Registry File в ветви HKEY_CURRENT_USER\Software\Borland\DBExpress. Изменение значения этого ключа можно сделать в момент установки приложения, а также не забыть включить в поставку сам файл dbxconnections.ini.
Как отсортировать записи в TSQLDataSet
Для типа команды:
ctQuery: порядок сортировки записей при выборке данных определяется конструкцией SQL ORDER BY, заданной в тексте запроса;
ctTable: порядок сортировки по умолчанию определяет SQL сервер. Для изменения порядка сортировки в этом случае необходимо в свойстве SortFieldNames указать имена полей сортировки, разделив их точкой с запятой. При генерации запроса на выборку таблицы данные поля будут вставлены в запрос в конструкции ORDER BY. Данный способ пригоден и для команды ctQuery. При этом в тексте SQL команды не должно содержаться ORDER BY. Однако первый описанный способ сортировки для типа команд ctQuery более предпочтителен;
ctStoredProc: порядок сортировки определяется в самой хранимой процедуре.
Как выполнять команды DDL и DML
Для выполнения команд DDL и DML, в TSQLConnection имеется два метода:
ExecuteDirect. Имеет всего один параметр - выполняемую команду SQL. Если возвращается значение 0, то команда выполнена успешно, иначе возвращается код ошибки dbExpress. Кода ошибок можно найти в файле dbExpress.pas;
Execute. Кроме самой команды SQL, может содержать список значений для входных параметров и указатель на результирующий набор данных (например если SQL команда возвращает набор). Если в качестве указателя на результирующий набор данных передать nil и команда SQL вернет набор данных, то он не будет учтен, но и не будет ошибок и исключений.
При многократном исполнении одних и тех же SQL команд, их следует параметризировать. Для облегчения заключения текстовых значений в кавычки, следует использовать функцию QuotedStr.
Пример:
SQLDataSet1 := TSQLDataSet.Create(nil); try SQLConnection1.Execute('select * from filials', nil, SQLDataSet1); ... finally SQLDataSet1.Free; end;
Как создать базу данных в InterBase
Так как с помощью метода ExecuteDirect не удается создать базу данных, то можно воспользоваться следующим способом (или низкоуровневым API):
Создать пустую базу данных;
Создать ресурс например с именем EMPTYDB, с помощью команды. EMPTYDB RCDATA DISCARDABLE "путь к EMPTY.GDB" и поместить данную команду в файл EmptyDB.RC;
С помощью компилятора ресурсов откомилировать: brcc32 EmptyDB.RC;
Полученный файл EmptyDB.RES, подключить в приложение с помощью {$R EmptyDB.RES}.
Пример:
{$R EmptyDB.RES} procedure CreateDB(const DatabaseName: string); var HRsrc: THandle; Stream: TResourceStream; begin HRsrc := FindResource(HInstance, PChar('EMPTYDB'), RT_RCDATA); if HRsrc <> 0 then begin Stream := TResourceStream.Create(HInstance, 'EMPTYDB', RT_RCDATA); try Stream.SaveToFile(DatabaseName); finally Stream.Free; end; end; end;
Как TDataSetProvider определяет изменена ли запись другим пользователем
Для этих целей компонент DataSetProvider имеет свойство UpdateMode. Когда провайдер генерирует операторы SQL для обновления базы данных, каждый оператор UPDATE или DELETE включает условие WHERE для идентификации записи. Если UpdateMode установлен в:
upWhereAll. В WHERE включены все поля. Обеспечивает наиболее высокую степень уверенности в том, что запись не изменялась со времени ее первоначального извлечения из базы данных. Если два пользователя редактируют одну и ту же запись, то первый пользователь может эту запись обновлять, тогда как второй пользователь получит сообщение об ошибке "Another user changed the record". Если в дальнейшем понадобится уточнить, какие именно поля следует проверять, следует установить значение pfInWhere в False;
upWhereChanged. В WHERE включены только ключевые и модифицированные поля. Два пользователя могут одновременно редактировать одну и ту же запись, если только редактируются разные поля;
upWhereKeyOnly. В WHERE включены только ключевые поля. Существующая запись всегда замещается новой. Реализуется принцип "выигрывает последний".
Как обновлять результаты многотабличных выборок, процедур и не редактируемых view
Имеется три метода:
Если запись включает столбцы из одной таблицы (например возвращаемые хранимой процедурой), то необходимо создать обработчик OnGetTableName, возвращающий имя таблицы которую необходимо обновить;
Для обновления многотабличных выборок, где надо обновлять записи только одной таблицы. Необходимо установить ProviderFlags конкретных полей для указания, что именно эти поля надо обновлять и создать OnGetTableName, возвращающий имя нужной таблицы. После этого провайдер будет генерировать операторы SQL для обновления таблицы автоматически;
Если нужно обновлять много таблиц для каждой записи, то необходимо также обрабатывать событие BeforeUpdateRecord, в котором можно создавать любое количество запросов, опираясь на различные факторы, например на значение параметра UpdateKind и значение полей в наборе DataSet. При просмотре или модификации записей, содержащихся параметре DeltaDS необходимо использовать свойства OldValue и NewValue соответствующего объекта TField (при использовании свойств TField.Value или TField.AsXXX может быть непредсказуемый результат).
Пример:
procedure TForm1.DataSetProvider1BeforeUpdateRecord(Sender: TObject; SourceDS: TDataSet; DeltaDS: TCustomClientDataSet; UpdateKind: TUpdateKind; var Applied: Boolean); var SQL: string; Connection: TSQLConnection; begin //Будем использовать соединение переданного набора данных Connection := (SourceDS as TCustomSQLDataSet).SQLConnection; case UpdateKind of ukInsert: begin SQL := 'Вставка записи в 1-ую таблицу'; Connection.Execute(SQL, nil, nil); SQL := 'Вставка записи в 2-ую таблицу'; Connection.Execute(SQL, nil, nil); end; ukModify: begin SQL := 'Изменение 1-ой таблицы'; Connection.Execute(SQL, nil, nil); SQL := 'Изменение 2-ой таблицы'; Connection.Execute(SQL, nil, nil); end; ukDelete: begin SQL := 'Удаление из 1-ой таблицы'; Connection.Execute(SQL, nil, nil); SQL := 'Удаление из 2-ой таблицы'; Connection.Execute(SQL, nil, nil); end; end; //Уведомляем провайдер, что изменения выполнены вручную Applied := True; end;
Где разместить бизнес-логику
Так как в обработчике BeforeUpdateRecord провайдера имеется возможность проверять запись перед ее обновлением, и изменять значения полей - то это лучшее место для размещения бизнес логики. Если в данном обработчике будет производиться модификация полей, перед отправкой на сервер базы данных, то необходимо установить poPropogateChanges в True. Теперь провайдер будет отсылать изменения обратно в ClientDataSet для обновления записей, хранимых в памяти.
Что такое клонирование данных
Это способность клиентского набора данных TClientDataSet, клонировать информацию из другого набора данных. При этом создается только одна физическая копия данных, к которой получают доступ два и более различных наборов данных. Изменения в одном наборе данных немедленно отражаются на представлении данных другого набора. Зачем это надо:
просмотр копии набора данных без использования текущего указателя записи первичного набора данных;
к копии можно применять различные фильтры и диапазоны, не зависимо от первичного набора данных.
Пример:
var cdsClone: TClientDataSet; begin cdsClone := TClientDataSet.Create(nil); try cdsClone.CloneCursor(ClientDataSet1, False, False); ... finally cdsClone.Free; end; end;
Какие функции доступны для локальной фильтрации клиентских наборов данных TClientDataSet
Функция |
Описание |
Пример |
= |
Проверка равенства |
ID=100 |
<> |
Проверка неравенства |
ID<>100 |
< |
Меньше чем |
ID<100 |
> |
Больше чем |
ID>100 |
<= |
Меньше или равно |
ID<=100 |
>= |
Больше или равно |
ID=>100 |
BLANK |
Пустое строковое поле (не тоже что NULL) |
Name=BLANK |
IS NULL |
Проверка на нулевое значение |
ID IS NULL |
IS NOT NULL |
Проверка на ненулевое значение |
ID IS NOT NULL |
AND |
Логическое И |
(ID=100) AND (Name=BLANK) |
OR |
Логическое ИЛИ |
(ID=100) OR (Name=BLANK) |
NOT |
Логическое ОТРИЦАНИЕ |
NOT (Name=BLANK) |
+ |
Сложение (чисел, строк и дат/времени) |
|
- |
Вычитание (чисел и дат/времени) |
|
* |
Умножение (чисел) |
|
/ |
Деление (чисел) |
|
Upper |
Верхний регистр |
Upper(Name)='PEGAS' |
Lower |
Нижний регистр |
Upper(Name)='pegas' |
SubString |
Вырезать подстроку |
SubString(Name, 3)='AS' |
Trim |
Вырезание начальных и конечных символов строки |
Trim(Name) или Trim(Name, '.') |
TrimLeft |
Вырезание начальных символов строки |
TrimLeft(Name) или TrimLeft(Name, '.') |
TrimRight |
Вырезание конечных символов строки |
TrimRight(Name) или TrimRight(Name, '.') |
Year |
Возвращает год из значения даты |
Year(BDay)=2003 |
Month |
Возвращает месяц из значения даты |
Month(BDay)=4 |
Day |
Возвращает дня из значения даты |
Day(BDay)=8 |
Hour |
Возвращает часы (24 часовой формат) из значения времени |
Hour(MTime)=14 |
Minute |
Возвращает минуты из значения времени |
Minute(MTime)=40 |
Second |
Возвращает секунды из значения времени |
Second(MTime)=0 |
GetDate |
Возвращает текущую дату и время |
BDayTime < GetDate |
Date |
Возвращает дату из значения дата/время |
Date(BDayTime) |
Time |
Возвращает время из значения дата/время |
Time(BDayTime) |
LIKE |
Частичное сравнение строк |
Name LIKE '%PEGAS%' |
IN |
Поиск во множестве значений |
Month(BDay) IN (10, 11, 12) |
* |
Частичное сравнение строк |
Name = '*AS' |
Способы развертывания приложения, использующего dbExpress
Имеется два способа: в виде автономного единого EXE файла, либо используя динамически подключаемые библиотеки DLL.
Для создания автономного файла, необходимо добавить в оператор USES ссылку на три DCU файла, находящихся в директории Lib.
Модуль |
Необходимо включить |
dbExpInt |
Если приложение подключается к базе данных InterBase |
dbExpOra |
Если приложение подключается к базе данных Oracle |
dbExpDb2 |
Если приложение подключается к базе данных DB2 |
dbExpMySQL |
Если приложение подключается к базе данных MySQL 3.23.x (dbExpMyS для версии 3.22.x) |
Crtl, MidasLib |
Если приложение dbExpress использует клиентские наборы данных. Лучше подключать всегда, так как без них у Delphi7 - случается внутренняя ошибка компиляции приложения |
Использование динамически подключаемыех библиотек DLL.
Работу механизма dbExpress в программе выполняют две библиотеки. Их имена совпадают с именами DCU файлов.
Библиотека DLL |
Используется |
dbExpInt.dll |
Если приложение подключается к базе данных InterBase |
dbExpOra.dll |
Если приложение подключается к базе данных Oracle |
dbExpInf.dll |
Если приложение подключается к базе данных Informix |
dbExpMSS.dll |
Если приложение подключается к базе данных MS SQL |
dbExpDb2.dll |
Если приложение подключается к базе данных DB2 |
dbExpMySQL.dll |
Если приложение подключается к базе данных MySQL 3.23.x (dbExpMyS.dll для версии 3.22.x) |
Midas.dll |
Если приложение dbExpress использует клиентские наборы данных. Также данную библиотеку необходимо регистрировать в реестре. |
Все дополнительные библиотеки должны находится либо в директории вашей программы, либо в директориях указанных в переменной PATH.
СОДЕРЖАНИЕ И ПОРЯДОК ВЫПОЛНЕНИЯ РАБОТЫ
Изучить теоретические введения.
Создать новый проект.
Поместить на форму основные компоненты для использования технологии доступа к данным InterBase Express.
Подключить базу данных и связать компоненты для использования технологии.
Написать код, который позволяет манипулировать данными с использованием методов и свойств технологии InterBase Expres.
Проверить работоспособность подключения.
Проверить работу всего проекта.
Продемонстрировать преподавателю работу разработанного образца проекта.
Получить от преподавателя индивидуальное задание и создать проект (по аналогии) для выполнения индивидуального задания.
Подготовиться к защите лабораторной работы, которая включает в себя демонстрацию индивидуального варианта, защиту по контрольным вопросам теоретической части работы.
Вопросы выходного контроля:
Расскажите, какие компоненты необходимы для использования технологии dbExpress.
Расскажите, как подключать компоненты использования технологии dbExpress.
Перечислите все компоненты, которые могут использоваться в технологии dbExpress.
Охарактеризуйте некоторые методы и свойства компонентов для использования технологии dbExpress.
Перечислите главные отличия при использовании технологий InterBase Expres и dbExpress.