Russian Belarusian English German Japanese Ukrainian

Rashka.studio - игры и приложения для Android! Заходи, ждём тебя =)

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

CuBook05

Компонент Query представляет собой набор данных, записи которого формируются в результате выполнения SQL-запроса и основаны на реляционном способе доступа к данным. При работе с удаленными БД рекомендуется использовать именно набор данных Query.
При работе с удаленными БД следует обращаться к средствам языка SQL. Это относится и к таким операциям, как перемещение по набору данных или вставка в него записей. Если же для компонента Query используются методы типа Next или insert, то вместо реляционного способа доступа к удаленным данным будет применен навигационный способ доступа. В результате набор данных Query будет мало отличаться от набора данных Table.
Набор данных Query, в отличие от компонента Table, может включать в себя записи более чем одной таблицы БД. Текст запроса, на основании которого в набор данных отбираются записи, содержится в свойстве SQL типа TStrings. Запрос включает в себя команды на языке SQL и выполняется при открытии набора данных с помощью вызова его методов Exec SQL или open. Запрос SQL иногда называют SQL-программой.
 
При формировании запроса на этапе разработки приложения можно использовать текстовый редактор, вызываемый через Инспектор объектов двойным щелчком в области значения свойства SQL. SQL-запрос также можно формировать и изменять динамически, внося изменения в его текст (значение свойства SQL компонента Query) при выполнении приложения.
В процессе формирования SQL-запроса проверка его правильности не производится, и если в запросе имеются ошибки, то они выявляются только при открытии набора данных. Одним из вариантов предотвращения ошибок в SQL-запросе является его предварительная отладка, например, с помощью программы Database Desktop.
Рассмотрим пример приложения простейшего редактора, позволяющего подготавливать и выполнять SQL-запросы. Кроме визуальных компонентов, форма содержит два компонента доступа к данным Query1 и DataSource1, которые при выполнении приложения не видны.
 
Редактирование SQL-запроса осуществляется с помощью компонента Memo1. Набранный запрос выполняется при нажатии кнопки Выполнить (Button1), а результат выполнения отображается в компоненте DBGrid1.
 
Значения свойств DataSet источников данных DataSource1 и DataSource компонента DBGrid1, с помощью которых организуется взаимодействие компонентов Query1, DataSource1 и DBGrid1, устанавливаются при создании формы. В последующих примерах приложений значения этих свойств задаются через Инспектор объектов, поэтому инструкции, присваивающие свойствам необходимые значения, в модуле формы отсутствуют.
 
Приведем код файла Unit1Query.cpp формы Form1 приложения:
#include <vcl.h>
#pragma hdrstop
#include "UnitlQuery.h"
// ---------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForml *Forml;
// ---------------------
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner)
{
void __fastcall TForm1::FormCreate(TObject *Sender)
{
DataSource1->DataSet = Query1;
DBGrid1->DataSource = DataSource1;
}
// ---------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Query1->DatabaseName="BCDEMOS";
Query1->Close();
Query1->SQL->Assign(Memo1->Lines);
Query1->Open();
}
Напомним, что с помощью свойства DatabaseName задается псевдоним, определяющий путь к каталогу, в котором находятся файлы таблиц базы данных.
 
Метод Assign выполняет присваивание одного объекта другому, при этом объекты должны иметь совместимые типы. Применительно к списку строк (класс TStrings), которому принадлежат свойства SQL компонента Query1 и Lines компонента Memo1, подобное присваивание означает копирование информации из одного списка в другой с заменой содержимого последнего. Если размеры списков (число элементов) не совпадают, то после замены число элементов заменяемого списка становится равным числу элементов копируемого списка.
 
При наличии ошибки в тексте SQL-запроса генерируется исключение и выдается сообщение об ошибке, а результат запроса остается не определен. При этом набор данных Query1 автоматически закрывается.
 
Компонент Query обеспечивает выполнение SQL-запроса и является набором данных, который формируется на основе этого запроса. Формирование набора данных выполняется при активизации компонента Query вызовом Метода open или установкой свойству Active значения true. В ряде случаев при выполнении SQL-запроса не требуется возвращать набор данных, например, при удалении, вставке или изменении записей. В этом случае предпочтительнее выполнять запрос компонента Query не его открытием, а вызовом метода ExecSQL. При работе в сети вызов метода ExecSQL выполняет требуемую модификацию набора данных, не передавая в вызывающее приложение (компьютер) записи набора данных, что заметно снижает нагрузку на сеть.
 
Компонент Query может быть связан с таблицей БД или напрямую, или содержать копии отобранных записей таблицы, доступные для чтения. Вид взаимодействия определяется свойством RequestLive типа bool. По умолчанию свойство имеет значение false, и набор данных Query доступен только для чтения. Если пользователю или программисту требуется возможность редактирования записей, то свойству RequestLive нужно установить значение true. В этом случае набор данных Query напрямую связывается с соответствующей таблицей, аналогично набору данных Table.
Влияние свойства RequestLive зависит от текста выполняемого SQL-запроса. Если в результате выполнения запроса не может быть получен редактируемый набор данных, то установка свойству RequestLive значения true игнорируется.
Чтобы проверить результат установки значения свойству RequestLive, можно воспользоваться свойством CanModify типа bool. Если оно имеет значение true, то набор данных является редактируемым, если false нередактируемым.
 
Чтобы получить в результате выполнения SQL-запроса редактируемый набор данных, кроме установки свойству RequestLive значения true, должны быть выполнены следующие условия:
  • данные отбираются только из одной таблицы или просмотра (view);
  • таблица или просмотр допускают модификацию;
  • в запросе не используется операнд DISTINCT и агрегатные (статистические) функции;
  • в запросе не применяется соединение таблиц;
  • в запросе отсутствуют подзапросы и вложенные запросы;
  • не используется группирование данных;
  • сортировка применяется только к индексированным полям.
Для локальных БД вместо компонента Table можно также использовать компонент Query. Если установить свойству SQL значение SELECT *FROM DBNameTable, а свойству RequestLive значение true, то набор данных Query будет аналогичен набору данных Table. Здесь DBNameTable является именем таблицы БД, которое для компонента Table задается в свойстве TableName. Набор данных Query, в отличие от Table, не имеет системы индексов, поэтому к Query неприменимы методы, использующие индексирование, например, методы FindFirst, FindLast, FindNext и FindPrior.
Если заметили ошибку, выделите фрагмент текста и нажмите Ctrl+Enter

Добавить комментарий


Защитный код Обновить