- •Технології проектування баз даних в delphi
- •6.051001 - Метрологія та інформаційно-вимірювальні технології
- •Технології проектування баз даних в delphi
- •6.051001 - Метрологія та інформаційно-вимірювальні технології
- •1Введение
- •2Введение в базы данных
- •2.1Типы субд
- •2.2Стандарт odbc
- •2.3Технологии взаимодействия delphi с бд
- •2.3.1Особенности технологии bde
- •2.3.2Особенности технологии ado
- •2.4Таблицы бд и связи между ними
- •2.5Первичные ключи и индексы
- •2.6Демонстрационная бд "поставщик книг"
- •3Использование odbc для подключения источника данных. Псевдонимы бд
- •3.1Внешний и внутренний псевдонимы бд
- •3.1.1Создание внешнего псевдонима
- •3.1.2Проверка работоспособности внешнего псевдонима в среде Delphi
- •3.2Внутренний псевдоним бд
- •3.2.1Назначение внутреннего псевдонима бд
- •3.2.2Создание внутреннего псевдонима
- •3.2.3Преимущества использования внутреннего псевдонима и проблемы перехода на другие субд
- •4Создание проекта с бд в технологии bde
- •4.1Особенности использования bde для соединения с источником данных
- •4.2Структура проекта с бд и визуальными компонентами
- •4.3Активизация проекта
- •4.4.4Компоненты tdbGrid
- •4.5Модуль данных
- •4.5.1Создание модуля данных tDataModule
- •4.5.2Связь модуля главного окна с модулем данных
- •4.5.3Создание компонента tDatabase
- •4.5.4Создание компонента tTable
- •4.5.5Создание компонента tDataSource
- •4.5.6Связь модуля главного окна с модулем данных
- •4.5.7Связь сетки tdbGrid и навигатора dbNavigator c источником данных tDataSource
- •4.5.8Связь главный-детальный между наборами данных
- •4.5.9Задание реляционной связи между наборами данных
- •4.5.10Активизация наборов данных
- •4.5.11Недостатки полученных решений и пути их устранения
- •4.6Объекты-столбцы сетки dbGrid
- •4.6.1Создание объектов-столбцов
- •4.6.2Редактирование объекта-столбца
- •4.7Объекты-поля наборов данных
- •4.7.1Назначение объектов-полей
- •4.7.2Создание объектов-полей
- •4.7.3Присоединение к наборам данных новых полей
- •4.7.4Присоединение полей из других таблиц. Подстановочные поля
- •4.7.5Вычисляемые поля
- •4.8Обработчики событий компонент работы с бд
- •4.8.1Обработчики событий OnGetText полей нд и компонента визуализации данных tdbGrid
- •4.8.2Установка системных переменных в обработчике событя OnCreate
- •4.9Бизнес-правила и обработчики событий компонент работы с бд
- •5Sql запросы к бд
- •5.1Компонент tQuery
- •5.2Создание компонента tQuery
- •5.3Использования компонента tQuery
- •5.3.1Свойство sql компонента tQuery
- •5.3.2Методы Open и ExecSql
- •5.3.3Схема программного формирования sql-запроса
- •5.3.4Параметрические запросы
- •5.3.5Параметрические запросы и свойство DataSource компонента tQuery
- •5.3.6Связь главный-детальный с компонентом tQuery в качестве детального набора данных
- •5.4Доступ к полям запроса
- •5.4.1Обращение к значению поля при помощи свойств объектов-полей Value и AsXxxx
- •5.4.2Обращение к значению поля при помощи свойств набора данных Fields и FieldValues
- •5.4.3Обращение к значению поля при помощи функции набора данных FieldByName
- •5.5Программный доступ к данным запроса
- •5.5.1Общая схема программного доступа к данным запроса
- •5.5.2Последовательная навигация по записям
- •5.6Обзор событий компонента tQuery
- •6Хранимые процедуры и триггеры
- •6.1Хранимые процедуры
- •6.2Создание хранимых процедур
- •6.3Вызов хранимых процедур
- •6.4Триггеры
- •7Наборы данных
- •7.1Обзор событий класса tdbDataSet
- •7.1.1Реализация каскадных изменений и бизнес-правил
- •7.1.2Другие события
- •8Технология ado
- •8.1Основные особенности технологии ado
- •8.2Реализация технологии ado в Delphi
- •8.3Создание проекта с бд в технологии ado. Установка связи с бд
- •8.3.1Создание модуля данных
- •8.3.2Начало настройки связи
- •8.3.3Выбор провайдера
- •8.3.4Настройка провайдера
- •8.3.5Настройка провайдера Microsoft Jet 4.0 ole db Provider
- •8.3.6Настройка провайдера Microsoft ole db Provider for odbc Drivers
- •8.3.7Завершение настройки связи
- •8.3.8Настройка оставшихся компонент модуля данных
- •8.4Особенности использования компонентов ado
- •8.4.1Базовые объекты ado
- •8.4.2Объект Recordset
- •8.4.3Объект Command
- •8.4.8Связной компонент tadoConnection
- •8.4.9Компонент tadoCommand
- •8.5Свойства, методы и события ado компонентов-наборов
- •8.5.1Общие свойства с bde-компонентами
- •8.5.2Специфические свойства
- •8.5.3Методы класса tCustomAdoDataSet
- •8.5.4События класса tCustomAdoDataSet
- •8.6Компонент tadoDataSet
- •8.7Компонент tadoTable
- •8.8Компонент tadoQuery
- •9Компоненты визуализации данных в Delphi
- •9.1Компонент tdbGrid
- •9.1.1Свойства
- •9.1.2Дополнительные возможности сетки
- •9.2Компоненты визуализации полей текущей записи
- •9.2.1Компонент tdbText
- •9.2.2Компонент tdbEdit
- •9.2.3Компонент tdbCheckBox
- •9.2.4Компонент tdbRadioGroup
- •9.2.5Списочные компоненты
- •9.2.6Компонент tdbMemo
- •9.2.7Компонент tdbRichEdit
- •9.2.8Компонент tdbCtrlGrid
- •9.2.9Компонент tdbNavigator
- •Приложение 2. Бд "поставщик книг"
- •Рекомендованная литература
5.3.3Схема программного формирования sql-запроса
Ниже приводится традиционная схема программного формирования и активизации SQL-запроса. Она состоит в следующих шагах:
Закрытие текущего запроса, если ранее он был открыт на этапе проектирования или выполнения программы;
Очистка текста – свойства SQL, текущего запроса;
Формирование нового текста SQL-запроса;
Заненсение текста SQL-запроса в свойство SQL компонента TQuery;
Открытие или активизация запроса;
В случае результативного выполнения запроса Select выполняется переход к первой записи временной таблицы, содержащей результат запроса.
Ниже приводится соответствующий фрагмент текста программы. При этом компонент quNakls расположен на главной форме.
var SQLTxt: string; … begin 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 = "02.03.2000" '; quNakls.SQL.Add(SQLTxt); //Занесение нового текста запроса //в свойство SQL quNakls.Open; // Открытие запроса quNakls.First; //Переход к первой записи результата запроса end; |
5.3.4Параметрические запросы
Запросы, которые рассматривались до сих пор, относятся к статическим запросам, т.е. запросам, ограничения в которых заданы явно – в виде соответствующих констант. Пусть, например, нужно создать запрос, который возвращает НД со списком партнеров, поставивших книги 02.03.2000. Такой запрос является статическим.
Рисунок 4.58 – Текст статического запроса в окне редактора кода
Возможным решением по созданию динамического вопроса ывляется использование возможности по склеиванию строк. Действительно запрос является строкой. Поэтому его можно разбить на части и затем склеивать эти части перед отправкой запроса на выполнение. При этом некоторые части перед склеиванием могут быть специально подготовлены быть изменены.
Ниже приводится соответствующий фрагмент текста программы. При этом компонент 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.59 – Текст параметрического запроса в окне редактора кода
Начальное значение параметра DATE может быть задано на этапе разработки программы и изменено в процессе ее выполнения.
Для установки начального значения параметра DATE необходимо вызвать редактор свойства Params запроса (Рисунок 4 .60)
Рисунок 4.60 – Вызов редактора свойства Params
В результате появится окно редактора, содержащее заготовку для создаваемого параметра DATE. Первый по счету параметр имеет индекс 0.
Рисунок 4.61 – Содержимое редактора свойства Params
Теперь необходимо выполнить редактирование параметра DATE с помощью инспетора объектов дя этого параметра. Для этого необходимо щелкнуть мышью на DATE после чего появятся свойства параметра (Рисунок 4 .62)
Рисунок 4.62 – Определение начального значения параметра 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';
Если к моменту программного изменения параметра запрос был открыт, его нужно закрыть (Close) и очистить (Clear), а затем установить параметр(ы) и открыть вновь. Например:
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; //Переход к первой записи результата запроса |
Примечание. Параметры запроса в тексте программы записываются после занесения текста запроса в поле SQL.
Значение NULL свидетельствует о том, что полю не присвоено никакого значения ("пустое" поле). Значение 0 для числовых полей или пустая строка для текстовых полей - это вполне определенные, отличные от NULL значения. Чтобы присвоить параметру значение NULL при прогоне программы, следует выполнить его метод Clear (на этапе разработки нужно очистить свойство Value параметра в окне инспектора объектов). Например:
quNakls.Params[0].Clear;
