Мир объектов Excel 2000

Код, исполняемый на сервере


Давайте, вначале рассмотрим код, исполняемый на стороне сервера. Это логично, поскольку он выполняется первым и от его результатов, зачастую, зависит содержание страницы, поступающей клиенту. Приведу вначале декларативную часть кода, содержащую описание глобальных переменных, описание используемых процедур и функций:

<SCRIPT LANGUAGE=vbscript RUNAT=Server> '********************************************************** '** Объявления глобальных переменных, процедур и функций ** '************ на серверной стороне ************************ 'Задание объектов ADODB - Connection, Command, Recordset Dim Con1 'Объект ADODB, задающий соединение Dim Cmd1 'Объект ADODB, задающий команду Dim Rst1 'Объект ADODB, задающий набор записей

Sub CreateConnection() 'Создание соединения с тестовой базой данных Access Dim strConnStr 'Строка соединения If Con1.State <> 1 Then strConnStr="Provider=Microsoft.jet.oledb.4.0; " & _ "Data Source =c:\Ch20\dbPP2000.mdb" Con1.Open strConnStr End If End Sub 'CreateConnection Sub CreateRstBooks() 'Создание набора записей по данным хранимого запроса With Cmd1 .ActiveConnection = Con1 .CommandText = "Select * From [список книг]" .CommandType = 1 'adCmdText Set Rst1 =.Execute End With End Sub 'CreateRstBooks Sub CreateOptions() 'Програмное создание списка SelectBook 'Заполнение элементов этого списка по данным набора записей Dim str1 'Строковая переменная - автор и название книги Dim str2,str3,str4 'Строковые константы str2 = "<OPTION value = """ str3= """>" str4="</OPTION>" With Rst1 'Проход по набору записей и формирование элементов списка .MoveFirst 'Создание элемента SelectBook Response.Write("<Select id=""SelectBook""" & _ "Style= ""position:absolute; top:100; left:170"" > ") Do While Not .EOF str1 = Rst1("Автор") & ": " & Rst1("Название") Response.Write(str2 & str1 & str3 & str1 & str4) .MoveNext Loop Response.Write("</SELECT>") End With End Sub 'CreateOptions </SCRIPT>


Ну а теперь, как всегда, некоторые комментарии к этому коду. Работа с базой данных будет вестись, как и положено, через хорошо знакомые объекты ADO. Глобальные переменные Con1, Cmd1, Rst1, задающие эти объекты, уже не один раз встречались в наших примерах. Это же касается и процедуры CreateConnection, устанавливающей соединение с базой данных. В процедуре CreateRstBooks создается набор записей, содержащий данные о книгах. Подобные процедуры также встречались неоднократно при рассмотрении объектов ADO. На одно обстоятельство хочу обратить внимание. Для получения информации из базы данных используется хранимый запрос с именем "список книг". Вот его SQL-текст:

SELECT Книги.Автор, Книги.Название FROM Книги ORDER BY Книги.Автор;

При работе с базами данных на Web-страницах рекомендую использовать всюду, где можно, хранимые процедуры. В базе данных Microsoft Access, с которой я работаю во всех примерах данной книги, роль хранимых процедур играют хранимые запросы. Помимо многих других преимуществ такой способ хорош еще и тем, что надежно работает. В то же время при использовании других приемов работы с объектами ADO зачастую возникали ошибки там, где их не должно было бы быть.

Процедура CreateOptions по данным полученного набора записей программно создает интерфейсный объект - раскрывающийся список и определяет элементы этого списка. Если говорить более точно, то процедура динамически дописывает к имеющемуся HTML-коду страницы новый фрагмент HTML-кода, определяющий тег Select. Метод Write серверного объекта Response выполняет эту задачу. Когда браузер получит страницу от сервера и начнет выполнять присланный HTML-код страницы, то он создаст в дополнение к элементам определенным при проектировании страницы, и динамически созданный сервером элемент SelectBook.

Мы рассмотрели декларативную часть серверного кода. Теперь давайте взглянем на исполняемый код. Он небольшой и сводится к инициализации переменных и вызову рассмотренных нами процедур. Вот он:

<body> <SCRIPT LANGUAGE=vbscript RUNAT=Server> '********************************************************** '** Исполняемый код на серверной стороне ** '************ на серверной стороне ************************ 'Формирование глобальных объектов Set Con1=Server.CreateObject("ADODB.Connection") Set Cmd1=Server.CreateObject("ADODB.Command") Set Rst1=Server.CreateObject("ADODB.Recordset")



' Этот оператор моделирует регистрацию пользователя. Session("UserId")=6 'Получение информации о книгах из базы данных 'и формирование списка - элемента SelectBook 'Создать соединение с базой данных CreateConnection() 'Получить набор записей CreateRstBooks() 'Создать интерфейсный элемент - список SelectBook CreateOptions

</SCRIPT>

Из этого кода хочу обратить внимание на оператор, создающий объект Session("UserId"). Реально этот объект создается на начальной индексной странице при регистрации пользователя. Поскольку я не собираюсь описывать индексную страницу, то решил промоделировать ее работу, введением этого оператора, явным образом создавая объект Session и присваивая конкретное значение Id пользователю, работающему со страницей.

Разбор кода, выполняемого на серверной стороне, закончен, и можно переходить к коду, выполняемому на стороне клиента. Возможно, следовало бы привести полный HTML-код страницы, передаваемой клиенту, но я ограничусь только программным кодом.



Как видите, это запрос с пятью параметрами. Через параметры полям записи передаются - сам вопрос, дата задания вопроса, название и автор книги, по которой был задан вопрос и идентификатор пользователя, задавшего вопрос.

Понятно, что в функции SaveQuestion, вызывающей этот запрос, при формировании объекта ADODB.Command главной задачей является корректное формирование коллекции Parameters этого объекта. Дальше остается только вызвать метод Execute, чтобы выполнить запрос. Поскольку в главах, посвященных объектам ADO, я подробно рассматривал все свойства и методы этих объектов, в том числе работу с коллекцией Parameters, то теперь останавливаться на деталях, думаю, нет необходимости.

На этом можно и закончить описание вопросов создания программного кода, да и самой страницы в целом. В заключение взгляните, как выглядит эта страница, после того как пользователь послал свою оценку книги на сервер, и эта операция была успешно выполнена.


Рис. 11.6.  Страница qomToBase с уведомлением об успешном завершении операции


Содержание раздела