АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Установка значений параметров динамического запроса во время выполнения

Читайте также:
  1. B15 (высокий уровень, время – 10 мин)
  2. Can (прош. время could)
  3. Can (прош. время could)
  4. F Продолжение выполнения задания
  5. F Продолжение выполнения задания
  6. F Продолжение выполнения задания
  7. F Продолжение выполнения задания
  8. I. Выбор температурных напоров в пинч-пунктах и опорных параметров КУ.
  9. I. МЕСТО И ВРЕМЯ КАК ГРАНИЧНЫЕ УСЛОВИЯ
  10. I. Общая установка сознания
  11. I. Случайные величины с дискретным законом распределения (т.е. у случайных величин конечное или счетное число значений)
  12. II. Вычисление параметров рабочего тела в начале цикла ГТУ.

Самым распространенным способом указания текущих значений параметров является их ввод пользователем в поля ввода (компоненты TEdit и другие) и последующее программное назначение параметров.

Параметры компонента TQuery доступны через его свойство

property Params[Index: Word]:TParams;

Это свойство является набором параметров, где каждый параметр определяется индексом в диапазоне 0..ParamCount-1, где ParamCount есть число параметров, которое можно получить с помощью свойства ParamCount компонента TQuery: property ParamCount: Word;

Обратиться к конкретному параметру можно:

1) указав индекс параметра в свойстве Params компонента TQuery, например, Params[0]. Порядок следования параметров аналогичен показываемому в окне редактора параметров (активизирующегося после нажатия кнопки в строке свойства Params инспектора объектов);

2) через метод компонента TQuery

function ParamByName (const Value: string): TParam;

где Value определяет имя параметра.

Для установки значения конкретного параметра используется одно из свойств компонента TParamAxNNN(AsSirmg, Aslnteger и т.д.) или более общее свойство property Value: Variant;

Например

Query1.Params[0].AsDate:=StrToDate(Edit1.Text);

Query1.ParamByName(‘fio’).Value:=Edit2.Text;

 

procedure TForm_DinZapr.Button1Click(Sender: TObject); begin Query1.Close; Query1.Params[0].asinteger:=StrToInt(Edit1.Text); Query1.Params[1].asstring:=Edit2.Text; Query1.Open; end;  

Методы Prepare a Unprepare

Синтаксис SQL-операторов проверяется только при их выполнении.

Проверка синтаксиса требует времени, что особенно актуально для больших запросов при обращении к удаленным БД. Однако в динамических запросах изменяются только значения параметров, а сам синтаксис хотя бы единожды исполненного SQL-оператора является верным. Поэтому каждый раз выполнять проверку синтаксиса такого оператора не следует. Вместо этого запрос компилируется в исполняемый код и, если текст его не изменялся, а изменялись только значения параметров, проверка Синтаксиса не производятся и происходит немедленное выполнение уже откомпилированного запроса.

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



procedure Prepare;

Выполнение этого метода для динамических запросов с неизменным синтаксисом лучше делать в обработчике события формы OnCreate. В дальнейшем можно многократно присваивать параметрам различные значения и выполнять запрос методами Open и ExecSQL.

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

Свойство компонента TQuery

property Prepared: Boolean;

возвращает True, если НД был "подготовлен" методом Prepare.

Метод procedure UnPrepare;

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

 

Указание значения NULL для параметров

Значение NULL показывает отсутствие значения в поле или присутствие неопределенного значения. Для числовых полей значение 0 и пустая строка, для строковых полей – это вполне определенные значения, отличные от NULL (значение неопределенное).

Часто при добавлении или корректировки записей (SQL-операторы INSERT, UPDATE) необходимо указать значение NULL для какого-либо параметра. Для этого следует выполнить метод Clear компонента TParam:

procedure Clear;

 

Передача параметров через свойство DataSource

Для передачи параметров может служить свойство DataSource компонента TQuery:

property DataSource: TDataSource;

В случае использования этого свойства явные присваивания значений параметрам динамического запроса не производятся, то есть не кодируются операторы присваивания типа

Query1.ParamByName(‘ИмяПараметра').Value:=Значение;

В этом случае приложение определяет, имеется ли ссылка на какой-либо компонент TDataSource в свойстве DataSource. Если ссылки нет, возбуждается исключительная ситуация; если есть, то в наборе данных, связанном с TDataSource, отыскиваются поля, одноименные параметрам динамического запроса. Если такие поля есть, их текущие значения берутся в качестве значений параметров: если таких полей нет, возбуждается исключительная ситуация.

‡агрузка...

Формируемые запросы

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

Свойство SQL компонента TQuery имеет тип TStrings:

property SQL: TStrings;

потому содержимое свойства SQL может формироваться программно методами Add (добавить элемент), Delete (удалить элемент), Clear (очистить список) и др.

procedure TForm_DinZapr.Button2Click(Sender: TObject);

begin

Query2.Close;

Query2.SQL.Clear;

Query2.SQL.Add(Memo1.Text);

Query2.Open;

end;


Использование TQuery для получения агрегированных значений

Часто нужно подсчитать некоторые агрегированные значения данных (минимум, максимум, среднее, счетчик повторений). В дальнейшем полученные значения могут входить в какие-либо условные операторы или операторы выбора приложения.

I; Пусть, например, необходимо помещать уникальное значение в поле \, N^RASH (номер записи расхода со склада) в габлицу'КАЗ-НОрт SQL-;; операторы INSERT, UPDATE не работают с автоинкрементными полями

(локальные СУБД). Поэтому при занесении новой записи в таблицу RASHOD ,;.' нужно определить уникальное значение поля JSL.RASH, для чего можно сделать

запрос к таблице RASHOD: .

WITH WorkQuery do begin .-1 .- "•' " '", ;, = ^_ r..s_

Close; ,'..' -. •'; "- — -*"•". . * - „,. .••'„". ;
Clear; " " ';
- SQL. Add ( % SELECT COUNT (*>, MAX fN__RASH} й-S MM; .' -
SQL.Add!"FROM RASHOD'>;
Open; '

E>^;//wi-h ••

Пусть добавление новой записи реализуется в компоненте InsertQuery
следующим динамическим оператором: -::

'^-UES [:N__PASK, iDAT^RASH, : KOLVC, : TOVAR, :?OKUP)

Тогда к параметр :N__RASH слезет поместить значение поля М набора , ^акмых компоиеша WorkQuery:

"^•**|1ы*;
———.. —,..„.—————-""•"•"• " ' * '^--^_"™Щ

^V -^J~- 1 П 3 £з I." cOl> ё =Г V cio O^G'1 П J4

• : PararnByName { 'N_RASH' ; -Aslntsger := .. ,X.V'

WorkQuery. FieldByNa-ne ( \M' ) ,йз;пг_ддег t- i; ;. :|

£xecSQL; "':H:,-.;.'t.

ПОЯСНЕНИЕ.После выполнения запроса а компоненте WorkQuerv '"• ' -выдается резуль'илруюший ИД. содержащий одну строку. Указатель ' ^ тех'ушей записи во вновь открытом НД всегда устанавливается на':"'-¥ первую запись. Псотому. даже с&ш таблица RASHOD пуста, в поле М '"'^ будет значение NULL, преобразуемое затем свойством Asfniegcr в 0. 'f Набор данных в компоненте Work Query мог бы не содержать ни одно$Г-

• строки (если в ТБД RASHOD не было ни одной строки) тогда и только тогдаf'.',
если бы подсчет максимума производился оператором f

S3LFCT MAX(N_RASH) AS M " ' -' j|

FROM RASHOD • " _ /jf-

Однако, применяя вместо эгого оператор ' . . . !=.,

..; ." SELECT COUNT(*>, MAX(N__RASH) AS К '- . , . ,,м!|!|

-.. ' FROM RASHOD ' , ,;Uf|

мы всегда получаем хотя бы одну запись в результирующем НД; поскольку;!;.;
COUNT{*j всегда возвратит значение, отличное от NULL. - ф.:

9.11. Использование компонента TQueryдля Ц
локальных и удаленных БД • ' '^

Использование компонента TQuery происходит аналогично для случая |=;{
выполнения запросов к таблицам локальных СУБД (Paradox, dBase и т.д.) и ЛЛ* |я|
случая выполнений запросов к удаленным СУБД f InterBase, Oracle, Informix", j[ j
Sybase, MS SQL Server). Имеются, правда, ограничения для случая запросов X д;^
таблицам локальных СУБД. Эти ограничения состоят в усеченных возможностях ^
использования синтаксиса SQL-операторов. .^ k

Характеристики работы компонента TQuer> для случая локальных й;^!
удаленных СУБД позволяют рекомендовать: ^||
не использовать компонент TQuery для выполнения простых запросов >:^|
к локальным таблицам там. гле вполне можно обойтись компонентом ^.„^
ТТаЫе. поскольк} TQuery работает медленнее - он всегда создав- д1: ;
промежуточную" таблицу -ля формирования возврашаемого набора i;,^
ланны.х: Vl-;

• стараться как можно чапге использовать ко\шонгнт TQuery лля доступа .^-^
к удаленным таблицам. ,-й|Явная предпочтит-ельност!, использования комионеш a TQuery при доступе к

..--генным 1 абли цам определяется способом занесения записей в результирующий

uV Компонент ТТаЬЗе при своем открытии считывает асе -записи из удаленной

fVinui-i- если на 'записи в ТТаЫе наложена филыраиия (например, методом

"^„'кап^е}, она выполняется уже в клиен гском приложении, что уже не оптимально.

Применяемый Д1я ашиюгичных целей компонент TQuery считывает нужное число

УписеН (например, достаточное количество -записей для визуализации в

Ш0[(ентс TDBGrid), а оставшиеся записи считывает по необходимости.

Временные задержки при этом особенно актуальны для таблиц, состоящих so

Йсльикм о числа записей.

" Одиночные изменения в удаленной таблице, вносимые из ТТаЫе при помощи методов Ром, Delete, если они совершаются в рамках отдельной транзакции, также способны существенно заменить работу с БД. Компоненты TQuery; посылающие серверу БД запросы на удаление, добавление, корректировку записей, как правил'о. действуют над группами записей в рамках одной траизакпии. Кроме того, даже по своей идеологии компоненты TQuery много больше соответствуют архитектуре ''клиент-сервер" иг идеологии серверных БД, поскольку одним из основных положений при работе с дзешыми в SQL, является оперирование множествами записей. TTabic рассчитан на работу с одиночными записями и по своей сущности больше отвечает идеологии локальных (настольных, персональных) СУБД, исповедующих навигационный подход.

ЗАМЕЧАНИЕ.В примерах, приводимых к излагаемому материалу, в частности, по созданию приложений а архитектуре "клиент-сервер", встречается доступ к удаленным таблицам при помощи компонента ТТаЫе. но в основном из-за того, что реально "удаленная" БД работает пол управлением локальной версии SQL-сервера Borland InterBase, поставляемого вместе с Delphi Client/Server Suite, а также из-за того, что объем данных в учебных таблицах не превышает 10 записей.

Исследовать процесс соединения с сервером и реальные процессы доступа к БД, которые порождают те или иные SQL-операторы, можно, запустив приложение на выполнение под средой Delphi и вызвав SQL Moni)or (пункт главного меню Database \ SOL .Monitor или запустив его как отдельное приложение). В качестве примера приведем окно SOL Monitor, показывающее (рис. 9,11 и 9.12) операции над БД из приложения ятя выполнения оператора SELECT, реализующего внутреннее соединение таблиц RASHOD (8 записей) HTOVARY(3 записи):

-^L»'JT R. DAT RA3Hr R, TCVAP, 3 .KGLVO, T. ZFJMA " -

pOM ?,ASHOC R, TCVARY Т

AbER:; R.TCVAR - T.TQVAR •;-,:/ -

Дпэ некоторого убыстрения доступа к НД, который должен просматриваться °слеловгпельно только в направлении от начала до конш. можно установить в воистзо l-'niDirecuonai компснеша TQuery значение False:

property LniDirectional: Boolean;

BDr?T° nojBO;iHT отключить для НД механизм двунаправленных курсоров в
Ь. ч1! о лля больших объемов записей способно привести к экономии времени
^Pecvpcoii.


1 | 2 | 3 | 4 |


При использовании материала, поставите ссылку на Студалл.Орг (0.17 сек.)