190 likes | 387 Views
Из цикла лекций «Технологии разработки Internet-приложений» для студентов 4-го курса кафедры Компьютерных технологий физического факультета Донецкого национального университета. Технологии разработки Internet -приложений. Среда Delphi: CGI, ISAPI приложения Базы данных.
E N D
Из цикла лекций «Технологии разработки 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 выбрать поле 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, 31.12.2005) и заполнить ихзначениями 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
Основное свойство: DataSet – псевдоним БД Например, DBGrid1.DataSource:=DataSource1; DataSource посредник доступа к БД для других компонент 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-код страницы после таблицы (м.б. PageProducerColumns– массивколонок: 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-приложения • Создать Web-модуль, поместить Query1, QueryTableProducer1, Session1 • В Session1 установить AutoSesionName:=True; В QueryTableProducer1 заполнить DataBaseName и Query:=Query1;В Query1 заполнить SQL-контейнер (для тестирования – Select *…без параметров) и установить Active:=True; • 2 click на QueryTableProducer1 и настроить визуально HTML-таблицу; • Далее можно программировать передачу и прием 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" || "%" Ответ – только процессоры P-2… Пример SQL запроса с параметром: Query1.SQL: Select Product,Price,Demand From Shope.dbf where Product like :CPU || "%" Ответ – процессоры в соответствие с одним параметром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 Dobegin 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;