Web-приложения средствами Delphi - БД

advertisement
Из цикла лекций «Технологии разработки 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;
Download