Компоненты для работы с базами данных: TTable и TQueryРефераты >> Программирование и компьютеры >> Компоненты для работы с базами данных: TTable и TQuery
2. Есть возможность составлять SQL запросы, которые заставят сервер исполнить специализированные задачи, недоступные через родной язык Delphi.
SQL запрос можно создать используя компонент TQuery следующим способом:
1. Назначить Псевдоним (Alias) DatabaseName.
2. Используя свойство SQL чтобы ввести SQL запрос типа “Select * from Country”.
3. Установить свойство Active в True
Если обращение идет к локальным данным, то вместо псевдонима можно указать полный путь к каталогу, где находятся таблицы.
Объект TQuery один из наиболее полезных и гибких компонентов, доступных в Delphi. С помощью можно воспользоваться всей мощью, предоставляемой лидерами среди промышленных SQL серверов, вроде InrterBase, Oracle или Sybase.
Свойство SQL
Свойство SQL - вероятно, самая важная часть TQuery. Доступ к этому свойству происходит либо через Инспектор Объектов во время конструирования проекта (design time), или программно во время выполнения программы (run time).
Интересней, конечно, получить доступ к свойству SQL во время выполнения, чтобы динамически изменять запрос. Например, если требуется выполнить три SQL запроса, то не надо размещать три компонента TQuery на форме. Вместо этого можно разместить один и просто изменять свойство SQL три раза. Наиболее эффективный, простой и мощный способ - сделать это через параметризованные запросы, которые будут объяснены в следующей части. Однако, сначала исследуем основные особенности свойства SQL, а потом рассмотрим более сложные темы, типа запросов с параметрами.
Свойство SQL имеет тип TStrings, который означает что это ряд строк, сохраняемых в списке. Список действует также, как и массив, но, фактически, это специальный класс с собственными уникальными возможностями. В следующих нескольких абзацах будут рассмотрены наиболее часто используемые свойства.
При программном использовании TQuery, рекомендуется сначала закрыть текущий запрос и очистить список строк в свойстве SQL:
Query1.Close;
Query1.SQL.Clear;
Нужно обратите внимание, что всегда можно “безопасно” вызвать Close. Даже в том случае, если запрос уже закрыт, исключительная ситуация генерироваться не будет.
Следующий шаг - добавление новых строк в запрос:
Query1.SQL.Add(‘Select * from Country’);
Query1.SQL.Add(‘where Name = ’’Argentina’’’);
Метод Add используется для добавления одной или нескольких строк к запросу SQL. Общий объем ограничен только количеством памяти на вашей машине.
Чтобы Delphi отработал запрос и возвратил курсор, содержащий результат в виде таблицы, можно вызвать метод:
Query1.Open;
Например, следующий SQL запрос:
Select * form Country where Name like ’C%’
возвращает DataSet, содержащий все записи, где поле Name начинается с буквы ‘C’. Следующий запрос позволит увидеть все страны, в названии которых встречается буква ‘C’:
Select * from Country where Name like ‘%C%’;
Вот запрос, которое находит все страны, название которых заканчивается на ‘ia’:
Select * from Country where Name like ‘%ia’;
TQuery и Параметры
Delphi позволяет составить “гибкую” форму запроса, называемую параметризованным запросом. Такие запросы позволяют подставить значение переменной вместо отдельных слов в выражениях “where” или “insert”. Эта переменная может быть изменена практически в любое время. (Если используется локальный SQL, то можно сделать замену почти любого слова в утверждении SQL, но при этом та же самая возможность не поддерживается большинством серверов.)
Перед тем, как начать использовать параметризованные запросы, рассмотрим снова одно из простых вышеупомянутых предложений SQL:
Select * from Country where Name like ’C%’
Можно превратить это утверждение в параметризованный запрос заменив правую часть переменной NameStr:
select * from County where Name like :NameStr
В этом предложении SQL, NameStr не является предопределенной константой и может изменяться либо во время дизайна, либо во время выполнения. SQL parser (программа, которая разбирает текст запроса) понимает, что он имеет дело с параметром, а не константой потому, что параметру предшествует двоеточие ":NameStr". Это двоеточие сообщает Delphi о необходимости заменить переменную NameStr некоторой величиной, которая будет известна позже.
Нужно обратите внимание, что слово NameStr было выбрано абсолютно случайно. Использовать можно любое допустимое имя переменной, точно также, как выбирается идентификатор переменной в программе.
Есть два пути присвоить значение переменной в параметризованном запросе SQL. Один способ состоит в том, чтобы использовать свойство Params объекта TQuery. Второй - использовать свойство DataSource для получения информации из другого DataSet. Вот ключевые свойства для достижения этих целей:
property Params[Index: Word];
function ParamByName(const Value: string);
property DataSource;
Если подставлять значение параметра в параметризованный запрос через свойство Params, то обычно нужно сделать четыре шага:
1. Закрыть TQuery
2. Подготовить объект TQuery, вызвав метод Prepare
3. Присвоить необходимые значения свойству Params
4. Открыть TQuery
Второй шаг выполняется в том случае, если данный текст запроса выполняется впервые, в дальнейшем его можно опустить.
Вот фрагмент кода, показывающий как это может быть выполнено практически:
Query1.Close;
Query1.Prepare;
Query1.Params[0].AsString := ‘Argentina’;
Query1.Open;
Params - это индексированное свойство, которое имеет синтаксис как у свойства Fields для TDataSet. Например, можно получить доступ к первой переменной в SQL запросе, адресуя нулевой элемент в массиве Params:
Params[0].AsString := ‘”Argentina”’;
Если параметризованный SQL запрос выглядит так:
select * from Country where Name = :NameStr
то конечный результат (т.е. то, что выполнится на самом деле) - это следующее предложение SQL:
select * from Country where Name = “Argentina”
Все, что произошло, это переменной :NameStr было присвоено значение "Аргентина" через свойство Params.
Если в запросе содержится более одного параметра, для того чтобы иметь доступ к ним нужно изменить индекс у свойства Params
Params[1].AsString :=‘SomeValue’;
либо используя доступ по имени параметра
ParamByName(‘NameStr’).AsString:=’”Argentina”’;
Итак, параметризованные SQL запросы используют переменные, которые всегда начинаются с двоеточия, определяя места, куда будут переданы значения параметров.
Прежде, чем использовать переменную Params, сначала можно вызвать Prepare. Этот вызов заставляет Delphi разобрать ваш SQL запрос и подготовить свойство Params так, чтобы оно "было готово принять” соответствующее количество переменных. Можно присвоить значение переменной Params без предварительного вызова Prepare, но это будет работать несколько медленнее.
После того, как был вызыван метод Prepare, и после того, как были присвоены необходимые значения переменной Params, Нужно вызвать метод Open, чтобы закончить привязку переменных и получить желаемый DataSet. В нашем случае, DataSet должен включать записи где в поле “Name” стоит “Argentina”.