Я не раз убеждался, в удобстве создания и выполнения SQL - запросов в Дельфи. Сегодня мы познакомимся с созданием динамических запросов. Динамические запросы использую параметры, которые определяются двоеточием, за которым стоит имя передаваемого параметра -> oklad=:oklad. Пример: select * from Сотрудники, Отработка where Сотрудники.tab=Отработка.tab and oklad=:oklad Что делает это запрос? Происходит вывод всех полей (select * - все поля!) из двух таблиц (Сотрудники и Отработка), при совпадении у записей табельных номеров и окладу равному введенному. Для изменения SQL-запроса во время выполнения приложения, параметры необходимо связать. Параметры могут изменяться, запрос выполняться повторно, а данные обновляться. Для непосредственного редактирования значения параметра используется свойство Parameters, которое представляет из себя массив. Для того чтобы получить доступ к параметру, первым делом необходимо указать индекс и имя параметра: Query1.Parameters[0].value:=0; Query1.Parameters[0].name:=oklad; Пробуем реализовать это хозяйство: Создаем в Delphi новый запрос на основе таблиц MS SQL Server (я создал свою - Сотрудники). Запрос должен выводить все поля указанной таблицы, но только для тех записей, по которым оклад равен введенному (динамический параметр). Добавляем на форму объекты Edit1.Text и Button. В событии кнопки на щелчок мыши заносим следующий код, который можно откорректировать его под свои данные. procedure TForm1.Button2Click(Sender: TObject); begin Query1.close; //меры предосторожности if not Query1.prepared then Query1.prepared; //запрос подготовлен? if length(edit1.text) <> 0 then //проверка, параметр не должен быть пустым! Query1.Parameters[0].Value:=edit1.text else begin Query1.Parameters[0].value:=0; edit1.text:='0'; end; try //вот здесь используем исключительные ситуации Query1.Open; //GO, Go, Go... except //обрабатываем ошибки в случае их возникновения On Er: EDatabaseError do messageDlg(Er.message, mtError, [mbOK],0); //Er - дескриптор ошибки end; end; Разбор полета. При вызове метода prepared Delphi посылает SQL запрос на удаленный сервер. Сервер выполняет грамматический разбор и оптимизацию запроса. Преимущество такой подготовки запроса состоит в его предварительном разборе и оптимизации. Альтернативой здесь может служить подготовка сервером запроса при каждом его выполнении. Как только запрос подготовлен, подставляются необходимые новые параметры, и запрос выполняется. Запросы с динамическими параметрами очень удобная вещь, бывают случаи, когда необходимо использовать несколько параметров. Удобство реализации таких запросов позволяет создавать очень сложные запросы без напрягов. (Хотя сказано утрировано...)
|