Особенности набора данных Query 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Особенности набора данных Query



 Компонент Query представляет собой набор данных, записи которого формируются в результате выполнения SQL-запроса и основаны на реляционном способе доступа к данным. При работе с удаленными БД рекомендуется использовать именно набор данных Query.

Замечание

 При работе с удаленными БД следует обращаться к средствам языка SQL. Это относится и к таким операциям, как перемещение по набору данных или вставка в него записей. Если же для компонента Query используются методы типа Next или insert, то вместо реляционного способа доступа к удаленным данным будет применен навигационный. В результате набор данных Query будет мало чем отличаться от набора данных Table.

 В отличие от компонента Table, набор данных Query может включать в себя записи более чем одной таблицы БД. Текст запроса, на основании которого в набор данных отбираются записи, содержится в свойстве SQL типа TStrings. Запрос включает в себя команды на языке SQL и выполняется при открытии набора данных. Запрос SQL иногда называют SQL-программой.

 При формировании запроса на этапе разработки приложения можно использовать текстовый редактор, вызываемый через Инспектор объектов двойным щелчком в области значения свойства SQL.

 SQL-запрос также можно формировать и изменять динамически, внося изменения в его текст (значение свойства SQL компонента Query) непосредственно при выполнении приложения.

Замечание

 В процессе формирования SQL-запроса проверка его правильности не производится, и если в запросе имеются ошибки, то они выявляются только при открытии набора данных. Одним из вариантов предотвращения ошибок в SQL-запросе является его предварительная отладка, например, с помощью программы Database Desktop.

 Компонент Query обеспечивает выполнение SQL-запроса и является набором данных, который формируется на основе этого запроса. Формирование набора данных выполняется при активизации компонента Query вызовом метода open или установкой свойству Active значения True. В ряде случаев при выполнении SQL-запроса не требуется возвращать набор данных, например, при удалении, вставке или модификации записей. В этом случае предпочтительнее выполнять запрос компонента Query не его открытием, а вызовом метода ExecSQL. При работе в сети вызов метода ExecSQL выполняет требуемую модификацию набора данных, не передавая в вызывающее приложение (компьютер) записи набора данных, что заметно снижает нагрузку на сеть.

 Компонент Query может быть связан с таблицей БД или напрямую, или содержать копии отобранных записей таблицы, доступные для чтения. Вид взаимодействия определяется свойством RequestLive типа Boolean. По умолчанию свойство имеет значение False, и набор данных Query доступен только для чтения. Если пользователю или программисту требуется возможность редактирования записей, то свойству RequestLive нужно установить значение True. В этом случае набор данных Query напрямую связывается с соответствующей таблицей, аналогично набору данных Table.

 Чтобы получить в результате выполнения SQL-запроса редактируемый набор данных, кроме установки свойству RequestLive значения True, должны быть выполнены следующие условия:

 1. данные отбираются только из одной таблицы или просмотра;

 2. таблица или просмотр допускают модификацию;

 

 Объекты типа TField являются невизуальными и служат для доступа к данным соответствующих полей записей. Управляя объектами типа TField, можно управлять поведением полей, при этом все объекты полей являются независимыми друг от друга. Например, разработчик может запретить модификацию значения отдельного поля, несмотря на то, что набор данных в целом является модифицируемым и допускает изменение значений других полей. Кроме того, можно скрыть то или иное поле от пользователя, сделав его невидимым.

 Существуют следующие два способа задания состава полей набора данных:

 1. по умолчанию (динамические поля);

 2. с помощью редактора полей (статические поля).

 

 По умолчанию при каждом открытии набора данных как на этапе проектирования, так и на этапе выполнения приложения для каждого поля набора автоматически создается свой объект типа TField. В этом случае мы имеем дело с динамическими полями, достоинством которых является корректность отображения структуры набора данных даже при ее изменении. Напомним, что для компонента Table состав полей определяется структурой таблицы, с которой этот компонент связан, а для компонента Query состав полей зависит от SQL-запроса.

 Однако использование динамических полей имеет и существенные недостатки, связанные с тем, что для полученного набора данных нельзя выполнить такие действия, как ограничение состава полей или определение вычисляемых полей.

 Поэтому при необходимости этих операций следует использовать второй способ задания состава полей. На этапе разработки приложения с помощью Редактора полей можно создавать для набора данных статические (устойчивые) поля, основные достоинства которых состоят в реализации следующих возможностей:

 1. определение вычисляемых полей, значения которых рассчитываются с помощью выражений, использующих значения других полей;

 2. ограничение состава полей набора данных;

 3. изменение порядка полей набора данных;

 4. скрытие или показ отдельных полей при выполнении приложения;

 5. задание формата отображения или редактирования данных поля на этапе разработки приложения.

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

Редактор полей

 По умолчанию для каждого физического поля при открытии набора данных автоматически создается объект типа TField, а все поля в наборе данных являются динамическими и доступными для создания статических (устойчивых) полей используется специальный Редактор полей. В случае, если хотя бы одно поле набора данных является статическим, динамические поля больше создаваться не будут. Таким образом, в наборе данных будут доступны только статические поля, а все остальные считаться отсутствующими. Определить или отменить состав статических полей можно с помощью Редактора полей на этапе разработки приложения.

 Во время выполнения приложения определить вид полей набора данных можно с помощью свойства DefaultFields типа Boolean. Если его значение равно True, то набор данных имеет поля по умолчанию, т. е. динамические, в противном случае для набора данных заданы статические поля.

 Для запуска Редактора полей следует дважды щелкнуть на компоненте Table или Query или вызвать правой кнопкой мыши для этих компонентов контекстное меню и выбрать пункт Fields Editor.... Большую часть Редактора занимает список статических полей, при этом поля перечисляются в порядке их создания, который может отличаться от порядка полей в таблице БД.

 Первоначально список статических полей пуст, указывая, что все поля набора данных являются динамическими. С помощью Редактора полей разработчик может выполнить следующие операции:

 1. создать новое статическое поле;

 2. удалить статическое поле;

 3. изменить порядок следования статических полей.

 Кроме того, для любого выбранного в редакторе статического поля с помощью Инспектора объектов возможно задание или изменение свойств этого поля (объекта типа TField) и определение обработчиков его событий. Подобные действия разрешается производить благодаря тому, что соответствующие статическим полям объекты типа TField доступны на этапе разработки приложения.

 Для создания статического поля следует вызвать контекстное меню Редактора полей и выбрать пункт Add Fields (Добавить поля), в результате чего появляется диалоговое окно добавления новых полей. В списке Available fields (Доступные поля) окна содержатся все те поля набора данных, которые еще не являются статическими. После выбора одного или нескольких полей и нажатия кнопки ОК эти поля добавляются в состав статических полей набора данных. Добавленное статическое поле является полем данных и связано с конкретным физическим полем таблицы БД. Для добавления в список всех физических полей таблицы (для набора данных Table) или результата выполнения SQL-запроса (для набора данных Query) нужно выбрать в контекстном меню Редактора полей пункт Add all Fields (Добавить все поля).

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

 Существует три типа статических полей:

 1. поле данных, связанное с соответствующим физическим полем таблицы;

 2. вычисляемое поле, значение которого рассчитывается в обработчике события onCalcFields во время выполнения приложения;

 3. поле выбора, значение которого можно выбирать из списка, формируемого на основе заданных критериев и правил.

 Для создания нового статического поля любого типа нужно выбрать в контекстном меню Редактора полей пункт New Field..., в результате чего открывается одноименное диалоговое окно.

 Для задания общих свойств (параметров) нового поля используется группа управляющих элементов Field properties (Свойства поля). В строке Name задается значение свойства FieldName, являющееся именем поля, а в строке Component — значение свойства Name, являющееся названием компонента (объекта типа TField) поля. При программировании обычно используется имя поля. Значение в строке Component формируется Delphi автоматически, и попытка изменить его не приводит к желаемому результату. В панелях Туре и Size указываются тип данных и размер поля. Тип данных обязательно задается для всех полей, а необходимость задания размера зависит от типа данных. Например, для поля с типом данных integer задание размера не имеет смысла, а для типа string размер поля ограничивает максимальную длину строки.

 Тип нового поля выбирается с помощью группы переключателей Field type из следующих вариантов:

 1. Data — поле данных;

 2. Calculated — вычисляемое поле;

 3. Lookup — поле выбора.

 В группе Lookup definition (Определение выбора) для поля выбора устанавливаются такие параметры, как набор данных и поля связи, а также поля для формирования списка выбора и результата.

 После создания нового статического поля его свойства становятся доступными через Инспектор объектов и могут быть изменены.

Источник данных

 Источник данных используется как промежуточное звено между набором данных и визуальными компонентами, с помощью которых пользователь управляет этим набором данных. В Delphi источник данных представлен компонентом DataSource.

 Для указания набора данных, с которым связан источник данных, служит свойство DataSet типа TDataSet последнего. Визуальные компоненты связаны с источником данных через свои свойства DataSource. Обычно связь между источником и набором данных устанавливается на этапе проектирования в Инспек торе объектов, однако при необходимости эту связь можно установить или разорвать динамически. При смене у компонента DataSource набора данных визуальные компоненты автоматически подключаются к новому набору данных.

3.5 Управление транзакциями и кэширование памяти

3.5.1 Компоненты для работы с транзакциями и кэшем

Компонент TDatabase

Обычно при разработке приложений, использующих базы данных, с помощью утилит конфигурации BDE создаются псевдонимы, указывающие на тип и расположение данных. Компоненты ТТablе, TQuery, TStoredProc обладают свойством DatabaseName, при установке которого на этапе проектирования можно выбрать необходимый псевдоним из выпадающего списка или явно указать каталог, в котором располагаются таблицы локальных баз данных.

Однако иногда бывает необходимо создать псевдоним динамически или переопределить какие-либо параметры настройки драйвера базы. В этом случае обычно используется компонент TDatabase, помещаемый явно па форму или в модуль данных. Если определить свойство DatabaseName этого компонента, оно появится в списке псевдонимов при установке одноименного свойства DatabaseName компонентов ТТablе, TQuery и TStoredProc. Если компонент не был размещен на форме, то он будет создан динамически, с настройками по умолчанию. Так как компонент отвечает за взаимодействие с BDE, его создание будет инициироваться компонентами ТТablе, TQuery и TStoredProc.

Переопределить параметры псевдонима базы данных можно с помощью инспектора объектов. В свойстве TTransIsolation можно определить уровень изоляции транзакции. Также параметры псевдонима базы данных можно изменять в редакторе свойств компонента TDatabase. Окно редактора показано на рисунке. Вызывается редактор двойным щелчком мыши на компоненте.

 

Редактор свойств компонента TDatabase

Нажав кнопку Defaults, можно установить стандартные настройки данного псевдонима. Обратиться к параметрам псевдонима можно через свойство Params.
Также компонент TDatabase используется для сокращения числа обращений к базе данных. К примеру, если на форме расположено несколько компонентов, взаимодействующих с базой данных, то каждый из них обращается к серверу и передает ему параметры, идентифицирующие пользователя.
На сервере производится проверка и принимается решение о допуске пользователя к работе.

Для того чтобы минимизировать число обращений к серверу, все компоненты, предназначенные для работы с какой-либо базой данных, связываются через свойство Database с компонентом TDatabase, а тот, в свою очередь, связывается с базой данных. Если приложение должно работать с несколькими базами данных, то в модуле данных размещается несколько компонентов TDatabase.

Повлиять на выполнение серверных транзакций можно путем кэширования внесенных пользователем изменений вместо попытки немедленного сохранения их в базе данных. В этом случае изменения, внесенные пользователем, сохраняются в кэш данных методом Post и отсылаются на сервер методом Apply-Updates. Для включения механизма кэширования измененных данных свойству CachedUpdates компонентов ТТablе и TQuery присваивается значение True.

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

При выполнении метода ApplyUpdates автоматически запускается транзакция, которая завершается после внесения всех изменений на сервере. В случае успешного завершения транзакции кэш очищается.

Компонент TSession

Компонент TSession реализует текущий сеанс работы с базой данных и предназначен для управления всеми соединениями с базами данных. Компонент создается автоматически при запуске приложения. Явное использование компонента может быть продиктовано необходимостью создания многопоточных приложений баз данных. Компонент также может быть применен для управления настройками псевдонимов и драйверов.

Свойство SessionName определяет имя сеанса. Компоненты ТТablе, TQuery и TDatabase связываются с компонентом TSession через свойство Session, в котором указывается название сессии, определенной программистом. Свойства сессии, заданной компонентом TSession, действуют на все связанные с ним компоненты TDatabase.

Свойство Databases содержит массив связанных компонентов TDatabase. При помощи этого свойства можно получить доступ к активным базам данных, с которыми установлено соединение. А свойство DatabaseCount показывает количество связанных баз данных, методы GetDatabaseNames и GetAliasNames возвращают списки драйверов и псевдонимов баз данных. Метод GetAliasParams позволяет разработчику получить параметры данного псевдонима. А метод GetTableNames возвращает имена таблиц, содержащихся в обрабатываемой базе данных.

Также компонент имеет методы, позволяющие удалять псевдонимы баз данных и их драйверы, добавлять их и совершать иные действия.

3.6 Перехват исключительных ситуаций и обработка ошибок

3.6.1 Понятие исключительной ситуации. Классы исключений

 

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

Синтаксис обработки

 Итак, для того, чтобы в полной мере использовать всю мощь механизма исключений, рекомендуется:

использовать блоки try..except и try..finally;

локализовывать с помощью специальных методов место ошибки.

 Локализация места ошибки возможна с помощью трех подходов к обработке ошибок.

· использование процедуры Assert;

· использование адреса ошибки и MAP-файла с информацией об адресах процедур;

· использование повторного вызова исключения в обработчике try … except … end с отображением GUID.



Поделиться:


Последнее изменение этой страницы: 2021-12-15; просмотров: 58; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.17.79.60 (0.028 с.)