- •Bde та ado
- •Введение
- •Введение в базы данных
- •Типы субд
- •Стандарт odbc
- •Технологии взаимодействия delphi с бд
- •Особенности технологии bde
- •Особенности технологии ado
- •Таблицы бд и связи между ними
- •Первичные ключи и индексы
- •Демонстрационная бд "поставщик книг"
- •Использование odbc для подключения источника данных. Внешний псевдоним бд
- •Создание внешнего псевдонима бд
- •Создание проекта с бд в технологии bde
- •Особенности использованияbdeдля соединения с источником данных
- •Структура проекта с бд и визуальными компонентами
- •Активизация проекта
- •Главная форма проекта
- •Модуль данных
- •Создание модуля данныхTDataModule
- •Создание компонента tDatabase
- •Создание компонента tTable
- •Создание компонентаTDataSource
- •Связь модуля главного окна с модулем данных
- •Связь сеткиTdbGrid и навигатораDbNavigatorcисточником данныхTDataSource
- •Связь главный-детальный между наборами данных
- •Задание реляционной связи между наборами данных
- •Активизация наборов данных
- •Недостатки полученных решений и пути их устранения
- •Объекты-столбцы сетки dbGrid
- •Объекты-поля наборов данных
- •Создание объектов-полей
- •Присоединение к наборам данных новых полей
- •Присоединение полей из других таблиц. Подстановочные поля
- •Вычисляемые поля
- •Обработчики событий компонент работы с бд
- •Обработчики событий OnGetText полей нд и компонента визуализации данныхTdbGrid
- •Установка системных переменных в обработчике событяOnCreate
- •Бизнес-правила иобработчики событий компонент работы с бд
- •Implementation
- •Sql запросы к бд
- •КомпонентtQuery
- •СозданиекомпонентаtQuery
- •ИспользованиякомпонентаtQuery
- •Свойство sql
- •Методы Open и ExecSql
- •Параметрические запросы
- •Параметрические запросы и свойство DataSource компонента tQuery
- •Связь главный-детальный с компонентомTQuery в качестве детального набора данных
- •Доступ к полям запроса
- •Обращение к значению поля при помощи свойств объектов-полейValueиAsXxxx
- •Обращение к значению поля при помощи свойств набора данных Fields и FieldValues
- •Обращение к значению поля при помощи функции набора данных FieldByName
- •Программный доступ к данным запроса
- •Общая схема программного доступа к данным запроса
- •Последовательная навигация по записям
- •Обзор событий компонентаtQuery
- •Хранимые процедуры и триггеры
- •Хранимые процедуры
- •Создание хранимых процедур
- •Вызов хранимых процедур
- •Триггеры
- •Наборы данных
- •Обзор событий класса tdbDataSet
- •Реализация каскадных изменений и бизнес-правил
- •Другие события
- •Технология ado
- •Основные особенности технологии ado
- •Реализация технологии ado в Delphi
- •Создание проекта с бд в технологии ado. Установка связи с бд
- •Создание модуля данных
- •Начало настройки связи
- •Выбор провайдера
- •Настройка провайдера
- •Настройка провайдераMicrosoftJet4.0oledbProvider
- •Настройка провайдера Microsoft ole db Provider for odbc Drivers
- •Завершение настройки связи
- •Настройка оставшихся компонент модуля данных
- •Особенности использования компонентов ado
- •Базовые объекты ado
- •ОбъектRecordset
- •ОбъектCommand
- •ОбъектParameter
- •Компонент tadoCommand
- •Свойства, методы и события ado компонентов-наборов
- •Общие свойства с bde-компонентами
- •Специфические свойства
- •Методы класса tCustomAdoDataSet
- •События класса tCustomAdoDataSet
- •Компонент tadoDataSet
- •Компонент tadoTable
- •Компонент tadoQuery
- •Компоненты визуализации данных вDelphi
- •Компонент tdbGrid
- •Свойства
- •Дополнительные возможности сетки
- •Компоненты визуализации полей текущей записи
- •Компонент tdbText
- •Компонент tdbEdit
- •Компонент tdbCheckBox
- •Компонент tdbRadioGroup
- •Списочные компоненты
- •Компонент tdbMemo
- •Компонент tdbRichEdit
- •Компонент tdbCtrlGrid
- •Компонент tdbNavigator
- •Приложение 2. Бд "поставщик книг"
- •Рекомендованная литература
Параметрические запросы
Запросы, которые рассматривались до сих пор, относятся к статическим запросам, т.е. запросам, ограничения в которых заданы явно – в виде соответствующих констант. Пусть, например, нужно создать запрос, который возвращает НД со списком партнеров, поставивших книги 02.03.2000. Такой запрос является статическим.
Рисунок 4.48 – Текст статического запроса в окне редактора кода
Возможным решением по созданию динамического вопроса ывляется использование возможности по склеиванию строк. Действительно запрос является строкой. Поэтому его можно разбить на части и затем склеивать эти части перед отправкой запроса на выполнение. При этом некоторые части перед склеиванием могут быть специально подготовлены быть изменены.
Ниже приводится соответствующий фрагмент текста программы. При этом компонент quNakls расположен на главной форме.
var SQLTxt: string;
TmpTxt: string;
…
begin
quNakls.Close; // Закрытие запроса
quNakls.SQL.Clear; // Очистка запроса
// Формирование нового текста запроса
TmpTxt := '02.03.2000';
SQLTxt := 'SELECT NaklID, NDate, FName, TName, NSum, NFirm, ' +
'NPayedSum, NRetSum, NCoeff, NretDate ' +
'FROM Nakls, Firms, TypeNakl ' +
'WHERE FirmID = NFirm AND TypeID = NType AND ' +
'NSum > 10000 AND NType IN (0, 6) AND ' +
'NDate = ' + TmpTxt;
//'NDate = ' + Edit1.txt;
quNakls.SQL.Add(SQLTxt); //Занесение нового текста запроса в свойство SQL
quNakls.Open; // Открытие запроса
quNakls.First; //Переход к первой записи результата запроса
end;
Однако такое решение не всегда удобно. Поэтому в современных языках программирования в SQL-запросах применена техника подобная процедурам с параметрами, когда SQL-запрос уточняется с помощью набора параметров.
Значения параметров могут меняться в процессе прогона программы и, в общем случае, порождают одинаковые по структуре, но разные по содержанию НД.
В тексте параметрического запроса компонента TQuery имени параметра предшествует двоеточие ":". Количество параметров не ограничено.
Пусть, например, нужно создать запрос, который во время выполнения программы возвращает НД со списком партнеров, поставивших книги в определенный день, который указывается в параметре DATA. В этом случае вместо статического запроса, показанного выше, следует использовать параметрический запрос. В тексте параметрического запроса имени параметра DATE предшествует двоеточие ":".
Рисунок 4.49 – Текст параметрического запроса в окне редактора кода
Начальное значение параметра DATE может быть задано на этапе разработки программы и изменено в процессе ее выполнения.
Для установки начального значения параметра DATE необходимо вызвать редактор свойства Params запроса (рисунок 4.9)
Рисунок 4.50 – Вызов редактора свойства Params
В результате появится окно редактора, содержащее заготовку для создаваемого параметра DATE. Первый по счету параметр имеет индекс 0.
Рисунок 4.51 – Содержимое редактора свойства Params
Теперь необходимо выполнить редактирование параметра DATE с помощью инспетора объектов дя этого параметра. Для этого необходимо щелкнуть мышью на DATE после чего появятся свойства параметра (рисунок 7.11)
Рисунок 4.52 – Определение начального значения параметраDATE
Имена параметров могут быть произвольными идентификаторами Delphi. Регистр букв в них не имеет значения. Для задания начального значения параметра обычно достаточно в окне инспектора объектов определить его свойство Value, тогда Delphi автоматически укажет его тип данных в свойстве DataType. Если тип указан неверно (например, вместо integer среда Delphi выбрала SmallInt), следует раскрыть список этого свойства и выбрать тип данных явно. Не следует менять имя параметра в свойстве Name на другое, так как в этом случае Delphi не корректирует текст запроса и в нем будет фигурировать прежнее имя.
Для программного задания значения параметра (см. ниже) используется свойство компонента TQuery:
property Params[Index: word]: TParams;
Можно также использовать следующий метод компонента TQuery:
function ParamByName(const Value: string): TParam;
В первом случае конкретный параметр задается индексом Index, причем первый по тексту запроса параметр имеет индекс 0, второй - 1 и т. д. Во втором случае параметр определяется своим именем в тексте запроса (но не именем в свойстве Name инспектора объектов!). В любом случае при обращении к параметру его значение нужно явно приводить к типу данных параметра свойством AsXXXX:
quNakls.Params[0].AsDate := '02.03.2000';
quNakls.ParamByName('Date').AsDate := '02.03.2000';
Если к моменту программного изменения параметра запрос был открыт, его нужно закрыть, установить параметр(ы) и открыть вновь. Например:
quNakls.Close; // Закрытие запроса
quNakls.SQL.Clear; // Очистка запроса
// Формирование нового текста запроса
SQLTxt := 'SELECT NaklID, NDate, FName, TName, NSum, NFirm, ' +
'NPayedSum, NRetSum, NCoeff, NretDate ' +
'FROM Nakls, Firms, TypeNakl ' +
'WHERE FirmID = NFirm AND TypeID = NType AND ' +
'NSum > 10000 AND NType IN (0, 6) AND ' +
'NDate = :Date' ;
quNakls.SQL.Add(SQLTxt); //Занесение нового текста запроса в свойство SQL
//Параметры запроса записываются после занесения нового
//запроса
quNakls.Params[0].AsDate := 02.03.2000;
//quNakls.ParamByName('Date').AsDate := '02.03.2000';
quNakls.Open; // Открытие запроса
quNakls.First; //Переход к первой записи результата запроса
Примечание. Параметры запроса записываются после занесения нового запроса.
Значение NULLсвидетельствует о том, что полю не присвоено никакого значения ("пустое" поле). Значение0для числовых полей или пустая строка для текстовых полей - это вполне определенные,отличные от NULLзначения. Чтобы присвоить параметру значениеNULLпри прогоне программы, следует выполнить его методClear(на этапе разработки нужно очистить свойствоValueпараметра в окне инспектора объектов). Например:
quNakls.Params[0].Clear;