Опубликован: 20.12.2005 | Уровень: специалист | Доступ: платный | ВУЗ: Московский государственный университет имени М.В.Ломоносова
Лекция 12:

Реализация доступа к базам данных в среде DELPHI

Класс TQUERY

Компонент типа TQuery позволяет выполнять любой SQL-оператор, допустимый по синтаксису ODBC-драйвером. Если в качестве выполнимого оператора используется SQL-оператор SELECT, то компонент возвращает набор данных (результирующий набор).

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

Для определения набора данных TQuery следует установить значение свойства SQL и, возможно, свойства DatabaseName (свойство DatabaseName определяет имя источника данных, но для некоторых баз данных можно задать полное имя таблицы, включающее месторасположение файла, в тексте SQL-оператора, - в этом случае свойство DatabaseName не используется). Наиболее правильным подходом все же следует считать тот, при котором имя DSN источника данных указывается свойством DatabaseName, а в SQL-операторе определяется только имя таблицы без определения ее местоположения.

По умолчанию, набор данных, формируемый компонентом типа TQuery, не является редактируемым.

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

  • связать компонент TQuery с компонентом типа TUpdateSQL (например: Query1. Query1.UpdateObject:= UpdateSQL1; ) и определить для последнего значение свойства ModifySQL (например: update TBL1 set F1 = :F1, F2 = :F2 where F3 = :OLD_F3 );
  • установить значение свойства RequestLive равным True (поддержка этой возможности зависит от используемой базы данных).

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

  • DataSource - свойство, позволяющее указать родительский набор данных (для отношения "родительский-дочерний").

    Например, если свойство SQL содержит значение 'SELECT * FROM Tbl1 t WHERE (t.FNo = :FNo)', то значение переменной связи :FNo будет определяться из источника данных, указанного свойством DataSource.

  • Params - свойство, содержащее список параметров для SQL-оператора.

    Например:

    Query3.SQL.Clear;  // Очищаем значение свойств
    // Динамически формируем код SQL-оператора INSERT
    Query3.SQL.Add('INSERT INTO ADDRESS (F1, F2)');
    // Имена параметров указываются после символа :
    Query3.SQL.Add('VALUES (:F1, :F2)');
    // Устанавливаем значение параметров
    Query3.Params[0].AsString := 'Abc';
    Query3.Params[1].AsInteger := 123;
    Query3.ExecSQL;   // Выполнение SQL-оператора
  • RequestLive - свойство, определяющее, будет ли создаваемый набор данных редактируемым (возможность получения модифицируемого результирующего набора зависит от используемого SQL-сервера);
  • SQL - свойство, содержащее текст SQL-оператора (для автоматического формирования SQL-оператора можно вызвать из контекстного меню компонента TQuery диалог SQL Builder);
  • DatabaseName - свойство, определяющее имя подключаемого источника данных (имя DSN источника данных или имя, введенное классом типа TDatabase );
  • ExecSQL - метод, выполняющий SQL-оператор, указанный свойством SQL (для SQL-оператора, создающего набор данных, вместо ExecSQL используется метод Open ).

    ExecSQL можно вызывать для таких SQL-операторов как INSERT, UPDATE, DELETE, CREATE TABLE и т. п.

    Если перед вызовом ExecSQL не был вызван метод Prepare, то SQL-оператор будет одновременно и откомпилирован, и выполнен.

  • Prepare - метод, выполняющий компиляцию SQL-оператора.

    Вызов этого метода перед ExecSQL увеличивает скорость выполнения запроса при многократном повторении вызовов ExecSQL для одного и того же оператора (например, параметризированного запроса). Это позволяет откомпилировать SQL-оператор только один раз, а затем многократно его выполнять.

Ирина Шелтер
Ирина Шелтер
Россия, Нижний Новгород, НГПУ им. К.Минина, 2011
Михаил Бородай
Михаил Бородай
Россия, г. Москва