ДонНУ, кафедра КТ, проф. В. К. Толстых Технологии разработки Internet- приложений Среда Delphi: CGI, ISAPI приложения Базы данных Из цикла лекций «Технологии разработки Internet-приложений» для студентов 4-го курса кафедры Компьютерных технологий физического факультета Донецкого национального университета
Работа с базами данных (реляционные, навигационные) Реляционные БД. Примеры SQL-запросов Select * From Shope.dbf выбрать все поля из таблицы Shope.dbf Select Product,Price From Shope выбрать поля Product и Price из Shope.dbf Select Product,Price From Shope выбрать поле Product, где данные начинаются where Product like CPU||% на CPU (|| - объединить, % - любые символы) Update Shope записать в таблицу Shope.dbf Set name = unknown unknown в поле name salary = 0 и 0 – в salary, where number Between -1 and 1 если поле number содержит данные от -1 до +1 Insert Into Shope добавить в таблицу Shope.dbf (code, date) поля code, date Values (1, ) и заполнить их значениями 1 и
Table доступ к данным навигационной БД Основные свойства Table: DataBaseName – псевдоним БД TableName :String – файл таблицы БД Active :Boolean – открыть, связаться с таблицей Основные методы Table: Open – открыть, связаться с таблицей (Active:=True;) Close – разорвать связь с таблицей (Active:=False;)
Query доступ к данным реляционной БД Основные свойства Query: DataBaseName – псевдоним БД Active :Boolean – открыть, связаться с таблицей SQL :TStrings – SQL-запрос, его методы – Clear, Add(строка SQL) RequestLive :Boolean – разрешение на перезапись в БД Text :PChar – текст запроса Основные методы Query: Open – связаться, согласно SQL (Select), с таблицей (Active:=True;) Close – разорвать связь с таблицей (Active:=False;) ExecSQL – сформировать, проверить и выполнить SQL-запрос для изменений БД (вместо Open)
Query – Пример Query1.Close; – отключить БД (на всякий случай) Query1.SQL.Clear; – очистить запрос (на всякий случай) Query1.SQL.Add(Select * from test) – составить запрос Select Query1.Open – подключить БД, выполнить SQL-запрос Вместо метода Query1.Close можно использовать свойство Query1.Active:=False Вместо метода Query1.Open можно использовать свойство Query1.Active:=True
DataSource посредник доступа к БД для других компонент Основное свойство: DataSet – псевдоним БД Например, DBGrid1.DataSource:=DataSource1; Session Создает отдельные потоки доступа к БД для каждого запроса клиента (актуально для ISAPI) Основное свойство Session: AutoSessionName :Boolean – разрешение разным клиентам на одновременный доступ к БД (True)
QueryTableProducer генератор HTML-таблиц на основе SQL-запросов Основной метод: Content – распознает POST/GET-запрос, выделяет из него параметры, инициализирует компонент Query, подставляет полученные параметры в SQL-контейнер Query, подключает БД, создает HTML-таблицу Количество параметров в SQL-запросе должно точно совпадать с количеством параметров в Web-запросе. Параметры SQL-запроса - : параметр Например, Select Product, Price From Shope where Product like :CPU || %
QueryTableProducer Основные свойства: Query – имя компонента Query, содержащего SQL-запрос Caption :String – HTML-код заголовка таблицы Header :TStrings – HTML-код страницы перед таблицей (м.б. PageProducer) Footer :TStrings – HTML-код страницы после таблицы (м.б. PageProducer Columns – массив колонок: Count, Columns[i].BgColor='Gray… визуаль- RowAttributes – свойства строк (атрибуты ): Align, BgColor, VAlign ные TableAttributes – свойства таблицы (атрибуты ): Align, BgColor, Border… Переменные BgColor, Align… описаны в модуле HTTPProd
QueryTableProducer: Header: Ответ Web-сервера Электронный магазин Footer: Спасибо за интерес!
Визуальная настройка HTML-таблицы 2 click Свойство Active:=True Если нет параметров в свойстве SQL
QueryTableProducer Основные события: onCreateContent – перед генерацией HTMLкода, параметр Continue:=False – отмена генерации onGetTableCaption – перед генерацией заголовка таблицы, параметр Caption:=HTML string onFormatCell – перед генерацией каждой ячейки, параметр CellColumn :Integer – номер колонки параметр CellRow :Integer – номер строки параметры форматирования BgColor, Align, VAlign параметр CellData :string – HTML содержимое ячейки
Рекомендации для начального тестирования Web-приложения 1.Создать Web-модуль, поместить Query1, QueryTableProducer1, Session1 2.В Session1 установить AutoSesionName:=True; В QueryTableProducer1 заполнить DataBaseName и Query:=Query1; В Query1 заполнить SQL-контейнер (для тестирования – Select *… без параметров) и установить Active:=True; 3.2 click на QueryTableProducer1 и настроить визуально HTML-таблицу; 4.Далее можно программировать передачу и прием Web-параметров, усложнять вид HTML-таблицы, записывать данные в БД (разрешить NTFS запись в фалы БД) и т.п.
Пример работы с БД Shope.dbf Запрос клиента
Пример работы с БД Ответ сервера
Настройка компонент - БД (Таблица) – создать Alias ShopeCPU, разрешить NTFS запись в фалы БД Свойства Query1 – DatabaseName:ShopeCPU SQL: Select Product,Price From Shope.dbf - простой запрос для тестирования Аctive:True (подключение БД согласно SQL) Свойства QueryTableProducer1 – Query:Query1 Caption: Таблица процессоров серии Header: Ответ Web-сервера Электронный магазин Footer: Спасибо за интерес! Columns: … (визуально) Свойства Session1 – АutoSessionName: True
Запрос клиента Электронный магазин Показать таблицу процессоров серии Celeron Показать таблицу процессоров серии P-2 Показать таблицу процессоров серии P-3 Показать таблицу процессоров серии P-4
Простые примеры ответа сервера, обработчик события onAction Пример простого обработчика onAction : procedure TWebModule1.WebModule1WebActionItem1Action(Sender: TObject; Request: TWebRequest; Response: TWebResponse; var Handled: Boolean); begin Response.Content:=QueryTableProducer1.Content; end; Пример SQL запроса без параметров (тестирование связи): Query1.SQL: Select Product,Price,Demand From Shope.dbf where Product like P-2" || "%" Пример SQL запроса с параметром: Query1.SQL: Select Product,Price,Demand From Shope.dbf where Product like :CPU || "%" Ответ – только процессоры P-2… Ответ – процессоры в соответствие с одним параметром CPU в запросе
Усложненные примеры (чтение/запись в БД) procedure TWebModule1.WebModule1WebActionItem1Action(Sender: TObject; Request: TWebRequest; Response: TWebResponse; var Handled: Boolean); begin // сформировать Web-клиенту требуемую (параметр :CPU) таблицу: Response.Content:=QueryTableProducer1.Content; Response.SendResponse; // отправить таблицу Web-клиенту // занести в базу данные об этом запросе: With Query1 Do begin Close; SQL.Clear; SQL.Add('Update Shope.dbf'); SQL.Add('Set Demand=Demand+1'); // статистика запросов SQL.Add('where Product'); SQL.Add(' like "'+Request.ContentFields.Values['CPU']+'" || "%"'); ExecSQL; // составить, проверить и выполнить SQL-запрос Close; end;
Обработчик события onGetTableCaption // Оформление заголовка таблицы procedure TWebModule1.QueryTableProducer1GetTableCaption(Sender: TObject; var Caption: String; var Alignment: THTMLCaptionAlignment); begin Caption:=' Таблица процессоров серии '+ Request.ContentFields.Values['CPU']+' '; end; Обработчик события onFormatCell procedure TWebModule1.QueryTableProducer1FormatCell(Sender: TObject; CellRow, CellColumn: Integer; var BgColor: THTMLBgColor; var Align: THTMLAlign; var VAlign: THTMLVAlign; var CustomAttrs, CellData: String); begin if (CellRow>0)and(CellColumn=0) Then // в первом столбце, кроме заголовка - CellData:=' '+CellData+' - заказать '; end;