Компонент TSQLDataDriverEh.
TSQLDataDriverEh это универсальный драйвер обработки данных, взаимодействующих с сервером посредствам языка SQL. TSQLDataDriverEh содержит пять объектов типа TSQLCommandEh: SelectCommand, DeleteCommand, InsertCommand, UpdateCommand, GetrecCommand которые хранят SQL выражения и параметры соответственно для запроса данных, удаления записи, вставки записи, изменения записи, перезапроса записи. Для выполнения команд TSQLDataDriverEh вызывает глобальное событие DefaultSQLDataDriverResolver.OnExecuteCommand. Вы должны написать это событие, чтобы выполнить SQL выражения на сервере и по необходимости вернуть DataSet для считывания данных. В режиме поставщика TSQLDataDriverEh берет данные из DataSet'а созданного в событии DefaultSQLDataDriverResolver.OnExecuteCommand записывает их в TMemTableEh. По мере требования он берет данные текущей записи, записывает их в TMemTableEh и переходит к следующей записи. В режиме обработчика изменений он принимает измененную запись от TMemTableEh, и вызывает событие DefaultSQLDataDriverResolver.OnExecuteCommand передавая в качестве параметра DeleteCommand, InsertCommand или UpdateCommand.
TSQLDataDriverEh имеет свойство SpecParams типа TStrings. Вы можете использовать его для записи специальных значений, которые будете использовать в событии DefaultSQLDataDriverResolver.OnExecuteCommand. Это свойство также используется объектом TServerSpecOperationsEh когда экземпляр этого объекта присвоен свойству DefaultSQLDataDriverResolver.ServerSpecOperations. Список специальных значений зависит от типа объекта TServerSpecOperationsEh и заполняется аналогично описанию в разделе “Свойство TXXXDataDriverEh.SpecParams”
Свойство DefaultSQLDataDriverResolver.ServerSpecOperations имеет тип TServerSpecOperationsEh. Этот объект предназначен для обработки специальных операций до или после выполнения процедуры ExecuteCommand. TServerSpecOperationsEh является базовым классом для классов TOracleSpecOperationsEh, TMSSQLSpecOperationsEh, TInterbaseSpecOperationsEh, TInfromixSpecOperationsEh, TDB2SpecOperationsEh, TSybaseSpecOperationsEh и TMSAccessSpecOperationsEh. Каждый из этих объектов умеет обрабатывать свойство SpecParams в частности для получения автоинкрементных полей сгенерированных сервером. По названию класса можно определить тип сервера, для которого предназначен класс.
Для полнофункциональной работы TSQLDataDriverEh необходимо написать событие DefaultSQLDataDriverResolver.OnExecuteCommand чтобы выполнять запросы на сервер и присвоить свойство DefaultSQLDataDriverResolver.ServerSpecOperations объектом одного из наследников класса TServerSpecOperationsEh. Присваивать свойство ServerSpecOperations имеет смысл, если вы будете выполнять операции вставки в таблицы на сервере содержащие автоинкрементые поля.
Типичный код, для настройки работы компонент TSQLDataDriverEh во всем приложении, может выглядеть следующим образом:
// Нижеприведенный код настраивает работу компонент TSQLDataDriverEh во всем приложении,
// для работы с сервером InderBase через движок BDE.
uses … DataDriverEh, BDEDataDriverEh;
type
TMainForm = class(TMainForm)
Database1: TDatabase;
SQLDataDriverEh: TSQLDataDriverEh;
…
procedure TMainForm.FormCreate(Sender: TObject);
begin
DefaultSQLDataDriverResolver.OnExecuteCommand := OnExecuteSQLCommand;
DefaultSQLDataDriverResolver.ServerSpecOperations := TInterbaseSpecOperationsEh.Create;
end;
procedure TMainForm.FormDestroy(Sender: TObject);
begin
DefaultSQLDataDriverResolver.ServerSpecOperations.Free;
DefaultSQLDataDriverResolver.ServerSpecOperations := Nil;
end;
function TMainForm.OnExecuteSQLCommand(SQLDataDriver: TCustomSQLDataDriverEh;
Command: TCustomSQLCommandEh; var Cursor: TDataSet; var FreeOnEof,
Processed: Boolean): Integer;
begin
Result := DefaultExecuteBDECommandEh(SQLDataDriver, Command,
Cursor, FreeOnEof, Processed, Database1.DatabaseName);
end;
TSQLDataDriverEh является базовым классом для TBDEDataDriverEh, TIBXDataDriverEh, TDBXDataDriverEh и TADODataDriverEh. Эти объекты переопределяют процедуру ExecuteCommand и умеют сами выполнять SQL выражения на сервере и по необходимости возвращать DataSet для считывания данных. При вызове SQL команд, в этих компонентах создается DataSet, соответствующий типу доступа к данным. Для TBDEDataDriverEh это TQuery, для TIBXDataDriverEh это TIBXQuery и т. п. Кроме того, классы TBDEDataDriverEh, TIBXDataDriverEh, TDBXDataDriverEh автоматически определяют объект TServerSpecOperationsEh. Для TADODataDriverEh необходимо определять свойство DefaultSQLDataDriverResolver.ServerSpecOperations т.к. технология ADO не позволяет однозначно определить тип сервера.
TSQLDataDriverEh содержит следующие события:
OnExecuteCommand - пишите обработчик этого события, чтобы выполнить SQL выражение. В событии можно вызвать процедуру TCustomSQLDataDriverEh.DefaultExecuteCommand чтобы выполнить SQL выражение по умолчанию. TCustomSQLDataDriverEh.DefaultExecuteCommand вызывает процедуру DefaultSQLDataDriverResolver.ExecuteCommand, который, в свою очередь, вызывает событие DefaultSQLDataDriverResolver.OnExecuteCommand.
OnGetBackUpdatedValues - пишите обработчик этого события, чтобы получить с сервера обновленные значения записи. В событии можно вызвать процедуру TCustomSQLDataDriverEh.DefaultGetUpdatedServerValues чтобы выполнить действия по получению. TCustomSQLDataDriverEh.DefaultGetUpdatedServerValues выполняет процедуру DefaultSQLDataDriverResolver.GetBackUpdatedValues. Если она не была обработана в DefaultSQLDataDriverResolver, то вызывает InternalGetServerSpecOperations.GetBackUpdatedValues. InternalGetServerSpecOperations возвращает объект типа TServerSpecOperationsEh.
Свойство TXXXDataDriverEh.SpecParams.
Cвойство SpecParams содержит список параметров и значений. TXXXDataDriverEh используют их при выполнении SQL выражений. Значение каждого параметра должно храниться в отдельной строке в формате ‘ИМЯ_ПАРАМЕТРА=ЗНАЧЕНИЕ’. В зависимости от типа сервера (InterBase, Oracle, MSSQL, Informix) SpecParams может содержать следующие параметры.
При работе с сервером InterBase:
'GENERATOR' - определяет имя генератора значение InterBase. DataDriver использует этот параметр для получения текущего значение генератора перед вставкой новой записи.
'GENERATOR_FIELD' - определяет имя поля, которому будет присвоено текущее значение генератора после вставки новой записи.
'AUTO_INCREMENT_FIELD' - определяет имя поля, которому DataDriver проставит тип AutoIncremet. Используется при создании структуры внутреннего массива записей.
При работе с сервером Oracle:
'SEQUENCE' - задает имя поля Oracle последовательности. DataDriver использует этот параметр для получения текущего значения последовательности перед вставкой новой записи.
'SEQUENCE_FIELD' - задает имя поля, которому будет присвоено текущее значение последовательности после вставки новой записи.
'AUTO_INCREMENT_FIELD' - задает имя поля, которому DataDriver просвоит тип AutoIncremet. Используется при создании структуры внутреннего массива записей.
При работе с сервером MSSQL:
'AUTO_INCREMENT_FIELD' - задает имя поля, которому DataDriver проставит тип AutoIncremet. Используется при создании структуры внутреннего массива записей.
При работе с сервером Informix:
'AUTO_INCREMENT_FIELD' - задает имя поля, которому DataDriver проставит тип AutoIncremet. Используется при создании структуры внутреннего массива записей.
Пример списка параметров для InterBase сервера:
GENERATOR=EMP_NO_GEN
GENERATOR_FIELD=emp_no
AUTO_INCREMENT_FIELD=emp_no
SQL выражение для вставки записи должно содержать EMP_NO_GEN генератор.
insert into
employee (EMP_NO, FIRST_NAME)
values
(:EMP_NO, :FIRST_NAME)
Динамическое формирование SQL выражений при обновлении данных.
TSQLDataDriverEh позволяет формировать Insert, Update и Delete выражения динамически перед посылкой запроса на сервер. Это полезно когда таблица содержит много записей а изменения были только в нескольких полях. При формировании запроса компонент формирует SQL выражения только для полей которые были изменены. Это сокращает размер пакета данных передаваемых на сервер. Для настройки динамического формирования выражения используйте подсвойства свойства DynaSQLParams.
Свойство KeyFields задает ключевое поле записи. Оно будет использоваться для формирования условия WHERE при удалении или обновлении записи. Свойство UpdateFields задает все поля которые могут быть обновлены в таблице сервера. Свойство UpdateTable задает название обновляемой таблицы. Свойство SkipUnchangedFields определяет что поля у которых значения не изменились не добавлять в SQL выражение. Свойство Options имеет тип TDynaSQLOptionsEh и определяет операции для которых надо формировать динамические SQL выражение. Вы можете использовать комбинацию одного из следующих значений dsoDynamicSQLInsertEh, dsoDynamicSQLUpdateEh, dsoDynamicSQLDeleteEh.
TSQLDataDriverEh или TXXXDataDriverEh, что выбрать для работы.
Как TSQLDataDriverEh так и один из компонентов TBDEDataDriverEh, TIBXDataDriverEh, TDBXDataDriverEh и TADODataDriverEh (будем в дальнейшем называть их TXXXDataDriverEh) позволяют работать с БД без большого количества настроек.
Для TXXXDataDriverEh достачно установить свойство объекта БД (Для TBDEDataDriverEh это свойство Database типа TDatabase).
У TSQLDataDriverEh нет свойства объекта БД. Для его работы достаточно один раз написать в вашей программе событие DefaultSQLDataDriverResolver.OnExecuteCommand чтобы выполнять запросы на сервер и присвоить свойство DefaultSQLDataDriverResolver.ServerSpecOperations объектом одного из наследников класса TServerSpecOperationsEh чтобы правильно обрабатывать некоторые специфичные для разных серверов операции. DefaultSQLDataDriverResolver не визуальный объект, так что присваивать событие и свойство пройдется в коде программы, например в событии OnCreate вашей главной формы. Используя TSQLDataDriverEh можно быстро менять Engine доступа к данным. Для этого достаточно переписать глобальное событие DefaultSQLDataDriverResolver.OnExecuteCommand.
В период разработки различий в работе TSQLDataDriverEh и TXXXDataDriverEh почти нет. При открытии редактора компоненты TSQLDataDriverEh вам предлагается выбрать один из design-time типов доступа к данным надстроенных над движками BDE, ADO, IBX или DBX. Совсем не обязательно что бы движок доступа к данным реализованный в событии DefaultSQLDataDriverResolver.OnExecuteCommand совпадал с тем, что вы используете в период разработки.
Работа с TSQLDataDriverEh и TXXXDataDriverEh в период разработки.
Двойной щелчок на компоненте TSQLDataDriverEh и TXXXDataDriverEh открывает окно диалога редактирования TSQLDataEditWin. В период разработки TSQLDataDriverEh или TXXXDataDriverEh независимо от того присвоен или не присвоен объекта работы с базой данных (TDatabase для TBDEDataDriverEh) используют для работы Design-time копию объекта работы с базой данных. Если не было создано ни одного объекта работы с БД, то система предложит создать новый объект-копию. В зависимости от типа TDataDriver’а открывается свое окно создания объекта работы с ДБ. Для TSQLDataDriverEh выводится окно в котором вы можете выбрать тип доступа к данным (Engine) и сервис обработки данных сервера (DB Service). Тип доступа определяет движок доступа к данным и может быть одним из следующих типов: BDE, IBX, DBX или ADO. В зависимости от типа доступа по необходимости нужно задать “Сервис обработки данных”, объект который умеет получать список объектов БД. Если в системе уже присутствуют Design-time объекты БД то система предложит выбрать для работы один из них.
Окно редактирования TSQLDataEditWin содержит следующие элементы:
Дерево объектов БД. Таблицы, Вьюшки, Процедуры, Фукнции и т.д. Зависит от типа сервера.
Нижнее окно элементов текущего объекта в дереве объектов.
Грид вывода результатов выполнения Select выражения.
Закладка для ввода Select выражения компонента TSQLDataDriverEh (TSQLDataDriverEh.SelectSQL)
Закладки для ввода выражений типа Insert, Update, Delete, GetRec.
Закладки Other для ввода SpecParams и для параметров динамического формирования SQL выражений.
Обратная связь и отчет об ошибках
Не ленитесь сообщать мне обо всех ошибках обнаруженных в библиотеке, но если вы решили отправить мне подобную информацию, то подготовьте как можно больше информации об ошибке. Для проверки вашей информации я должен иметь возможность смоделировать эту ситуацию на моем компьютере.
Включайте информацию об операционной системе и Service Pack's, версии Delphi (с Build) и версии EhLib.
Также по возможности проверьте возникновение ошибки на других компьютерах, ОС, других версиях Delphi, других версиях EhLib.
Наиболее эффективный результат будет, если вы отошлете мне исходник проекта, который демонстрирует эту ошибку. Демо может включать в себя стандартные DataSet'ы (не от сторонних разработчиков) и использовать таблицы из DBDEMOS, либо вы можете скопировать свои данные из своего набора данных в TClientDataSet. Не присылайте мне проекты, содержащие компоненты сторонних разработчиков.
|