- •Работа с компонентом tQuery
- •Соединение компонента tQuery с базой данных
- •Соединение компонента tQuery и визуальных компонентов для работы с данными
- •Выполнение статических запросов
- •Методы открытия и закрытия компонента
- •Изменяемые tQuery
- •Выполнение динамических запросов Понятие динамического запроса
- •Формирование динамического запроса
- •Установка значений параметров динамического запроса во время выполнения
- •Методы Prepare a Unprepare
- •Указание значения null для параметров
- •Передача параметров через свойство DataSource
- •Формируемые запросы
- •Использование tQuery для получения агрегированных значений
Использование 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.