Из цикла лекций «Технологии разработки Internet-приложений» для студентов 4-го курса кафедры Компьютерных технологий физического факультета Донецкого национального университета Технологии разработки Internetприложений Среда Delphi: CGI, ISAPI приложения Базы данных ДонНУ, кафедра КТ, проф. В. К. Толстых Работа с базами данных (реляционные, навигационные) Реляционные БД. Примеры SQL-запросов Select * From Shope.dbf выбрать все поля из таблицы Shope.dbf Select Product,Price From Shope выбрать поля Product и Price из Shope.dbf Select Product,Price From Shope where Product like “CPU”||”%” выбрать поле Product, где данные начинаются на 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 (code, date) Values (1, 31.12.2005) добавить в таблицу Shope.dbf поля code, date и заполнить их значениями 1 и 31.12.2005 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-запроса - :параметр Например, Select Product, Price From Shope where Product like :CPU || ”%” Количество параметров в SQL-запросе должно точно совпадать с количеством параметров в Web-запросе. QueryTableProducer Основные свойства: Query – имя компонента Query, содержащего SQL-запрос Caption :String – HTML-код заголовка таблицы Header :TStrings – HTML-код страницы перед таблицей (м.б. PageProducer) Footer :TStrings – HTML-код страницы после таблицы (м.б. PageProducer Columns – массив колонок: Count, Columns[i].BgColor='Gray‘… визуальные RowAttributes – свойства строк (атрибуты <Tr>): Align, BgColor, VAlign TableAttributes – свойства таблицы (атрибуты <Table>): Align, BgColor, Border… Переменные BgColor, Align… описаны в модуле HTTPProd QueryTableProducer: Header: <html> <body> <p><u> Ответ Web-сервера </u></p> <Center><H1> Электронный </H2></Center> <p> магазин Footer: <p><b><i> Спасибо за интерес! </i></b></p> </body> </html> Если нет параметров в свойстве SQL Свойство Active:=True 2 click Визуальная настройка HTML-таблицы 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: <html><body><p><u> Ответ Web-сервера </u></p> <Center><H1> Электронный магазин </H2></Center><p> Footer: <p><b><i> Спасибо за интерес! </i></b></p> </body></html> Columns: … (визуально) Свойства Session1 – АutoSessionName: True Запрос клиента <html> <body> <Center> <H1> Электронный магазин </H2></Center> <form method="POST" action="http://localhost/net-web/ Scripts/ResponseSQL.exe"> <input type="radio" name="CPU" value="Celeron-600" checked> Показать таблицу процессоров серии Celeron<br> <input type="radio" name="CPU" value="P-2"> Показать таблицу процессоров серии P-2<br> <input type="radio" name="CPU" value="P-3"> Показать таблицу процессоров серии P-3<br> <input type="radio" name="CPU" value="P-4"> Показать таблицу процессоров серии P-4 <P><input type="Submit" value="Отправить"></P> </form> </body> </html> Простые примеры ответа сервера, обработчик события onAction Пример 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 в запросе Пример простого обработчика onAction: procedure TWebModule1.WebModule1WebActionItem1Action(Sender: TObject; Request: TWebRequest; Response: TWebResponse; var Handled: Boolean); begin Response.Content:=QueryTableProducer1.Content; end; Усложненные примеры (чтение/запись в БД) 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; end; Обработчик события onGetTableCaption // Оформление заголовка таблицы procedure TWebModule1.QueryTableProducer1GetTableCaption(Sender: TObject; var Caption: String; var Alignment: THTMLCaptionAlignment); begin Caption:='<b>Таблица процессоров серии '+ Request.ContentFields.Values['CPU']+'</b>'; 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:=' <A href="URL">'+CellData+' - заказать</A>'; end;