Опубликован: 20.02.2006 | Доступ: свободный | Студентов: 3335 / 381 | Оценка: 4.34 / 3.99 | Длительность: 21:22:00
ISBN: 978-5-9570-0022-1
Лекция 12:

Программирование на ASP

< Лекция 11 || Лекция 12: 123456789
Запись данных из формы в базу данных: sub AddData

После блока комментариев "main entry point to the ASP" ("главная точка входа в ASP") код ASP инициирует объект ADO подключения к базе данных и присваивает переменную myConn точке объекта. Подключение ADO передается всем подпрограммам, чтобы они могли создавать свои собственные объекты ADO и подключать их к источнику данных. После создания объекта подключения вызывается подпрограмма AddData (см. рис. 12.8) для проверки данных, передаваемых в ASP.

'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
'sub AddData
'Checks Request Object for data submission and inserts
'the user submitted data into the database table 
'tblEmployee
' 
'in 
'     oConnection = ADO connection object
'out - nothing - writes to client
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
sub AddData(byval oConnection)

'check for data to write
if ((len(Request("number"))< 1) or _
     (len(Request("phone"))< 1) or _
     (len(Request("first_name"))< 1) or _
     (len(Request("last_name"))< 1)) then
     exit sub
end if

          
dim myCommand
dim sSQL
     
     'create the Command object
     set myCommand = Server.CreateObject("ADODB.Command")
     set myCommand.ActiveConnection = oConnection
     
     'build the insert statement
     sSQL = "INSERT INTO tblEmployee ("
     sSQL = sSQL & "[number], [phone], [first_name], [last_name])"
     sSQL = sSQL & " VALUES ('" & Request("number") 
     sSQL = sSQL & "','" & Request("phone") 
     sSQL = sSQL & "','" & Request("first_name") 
     sSQL = sSQL & "','" & Request("last_name")& "')"


     'put the command in the command object
     myCommand.CommandText = sSQL
     
     'execute the query
     myCommand.Execute      
     
end sub
Листинг 12.8. Part of ReadWriteDB.asp - AddData Subroutine Writing Data to Database

В подпрограмме AddData объект Request проверяется на наличие ожидаемых параметров – number, phone, first_name и last_name. При отсутствии любого из параметров подпрограмма завершает работу. Наличие параметров определяется проверкой длины параметра. Если все параметры имеют длину, равную хотя бы одному символу, объект команды ADO присваивается.

Использование объекта Command. Объект ADO Command используется в командах SQL или в других задачах, когда команда передается на сервер базы данных, но ответ набора записей требуется не всегда. Объект Command возвращает набор записей, но, как в нашем примере, команда SQL Update передается базе данных для выполнения. Команда SQL создается посредством конкатенации всех частей строки, необходимых для генерирования выражения обновления SQL, имеющего примерный вид:

INSERT INTO tblEmployee ([number],[phone],[first_name],[last_name])
VALUES ('8','444-4444','Tosa','Bergstaff')

Значения в секции VALUES команды SQL извлекаются из объекта Request. После ассемблирования команда SQL помещается в параметр CommandText объекта Command и обрабатывается с помощью функции Execute объекта Command. В случае успешного выполнения значения запишутся в базу данных. Ошибка означает, что некоторый элемент, участвующий в транзакции с базой данных (например, сервер) отсутствует или определен некорректно. Такая ошибка возникает из-за проблем с сетевыми подключениями либо из-за того, что разработчик неправильно указал имя таблицы или поля в коде.

Приемы программирования и программирование "вручную". Подпрограмма AddData имеет ограниченный набор функций, поскольку для нее задается имя таблицы, которое она обновляет, и имена параметров, запрашиваемые из объекта Request. Разработчики называют такой подход программированием "вручную", а значения называются магическими значениями или литералами. Как правило, программирование вручную реализуется для рационального и надежного выполнения, однако лучше его избегать. Литералы, зависимые от конкретной реализации приложения, нужно заменить и установить как параметры конфигурации приложения, которое можно откорректировать без редактирования кода.

Считывание информации из базы данных для отображения в браузере: sub ShowUserRecordset

После записи отправленной в базу данных информации ReadWriteDB.asp создает команду SQL для чтения всех данных из таблицы tblEmployee. Команда SQL присваивается переменной sSQL. Объект подключения MyConn и команда SQL sSQL передаются подпрограмме ShowUserRecordset. Оба аргумента передаются byval, поэтому их значения в подпрограмме изменить нельзя.

ShowUserRecordset принимает команду SQL и объект ADO Connection, открывает набор записей по команде SQL и записывает значения этого набора в браузер. Изучите код подпрограммы ShowUserRecordset, приведенный в листинге 12.9.

'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
'sub ShowUserRecordset
'Using the SQL command and the Connection object 
'instance passed in, prints the contents of the 
'recordset to the browser
'
'in 
'      sSQL = SQL command for recordset   
'     oConnection = ADO connection object
'out - nothing - writes to client
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
sub ShowUserRecordset(byval sSQL, byval oConnection)

dim myRecordset
dim sResult
dim oField

     'create the recordset
     set myRecordset = Server.CreateObject("ADODB.Recordset")
     myRecordset.Open sSQL, oConnection

     'write out the headings
     for each oField in myRecordset.Fields
          sResult = sResult & oField.Name & "         "
     next 
     Response.Write(sResult & "<br/>" )
     
     'check to see if there are records
     if( not myRecordset.EOF and not myRecordset.EOF) then
          
          'make certain that we are not at the end
          while(not myRecordset.EOF) 
          
               'build output string
               sResult=""
               for each oField in myRecordset.Fields
                sResult = sResult & myRecordset(oField.Name) & " " 
               next 
               sResult = sResult & "<br />"
               
               'write value to browser
               Response.write(sResult)
               
               'advance recordset
               myRecordset.moveNext()
          wend
     else
          Response.write("No records in table <br>")
     end if
     
     Response.write("<hr>")

     'shut down recordset and connection objects
     myRecordset.Close()
end sub
Листинг 12.9. Part of ReadWriteDB.asp - ShowUserRecordset Subroutine Reading Database and Showing Recordset

Методы ADO прохода по набору записей. Подпрограмма ShowUserRecordset в листинге 12.9 работает лучше, чем AddData, поскольку команда SQL передается в подпрограмму вместо ручного ввода. После создания и открытия экземпляра набора записей ADO при помощи кода SQL, переданного посредством параметра sSQL, имена полей набора записей выводятся в строковую переменную sResult. Переменная sResult предназначена для сбора текста, передаваемого браузеру командой Response.Write. Набор записей ADO поддерживает набор Fields, содержащий все поля, формирующие набор записей. Для циклового прохода через все поля в наборе в подпрограмме WriteCollection использован прием, показанный в листинге 12.2. В качестве значения индекса в цикле For...Next используется следующая форма псевдокода:

For each <variant> in <a collection>

Все переменные в VBScript имеют тип variant, поэтому любая объявленная переменная может выступить в роли переменной индексирования набора. Переменная oField является индексом в цикле For...Next, используемом для доступа к коллекции Fields набора записей MyRecordset в подпрограмме ShowUserRecordset. После записи в браузер результирующей строки имен полей набор записей проверяется на наличие записей, и выполняется цикл While...Wend, осуществляющий проход по записям. В цикл While...Wend включен еще один цикл For...Next, использующий набор полей MyRecordSet. Цикл Fields Collection указывает имя поля в наборе записей для получения значения, присоединяемого к строке sResult. Результатом каждой итерации цикла While...Wend является одна строка из открытого набора записей, записываемая в браузер.

Примечание. Многие программисты с опытом написания программ при выполнении прохода по набору записей довольно часто допускают одну ошибку – они забывают переходить к следующей записи в наборе. Строка myRecordset.moveNext() в листинге 12.9 выполняет такой переход. Это довольно распространенная ошибка, так как команда moveNext() не требует больших интеллектуальных затрат от программиста. Стратегия элемента настолько проста, что разработчик просто забывает включить этот элемент в код.

После продвижения по набору записей и передачи его браузеру этот набор нужно закрыть с помощью команды close() объекта recordset. Экземпляр набора записей уничтожается, если переменная, указывающая на экземпляр myRecordset, выходит за рамки области действия. Это происходит при завершении работы подпрограммы ShowUserRecordset. Тем не менее, мы не рекомендуем полагаться на ресурсы, освобождаемые при выходе переменной из области действия, так как это происходит не всегда при отключении подобным образом. Для закрытия подключения к базе данных и дальнейшей работы с ресурсами, занимаемых данным подключением, следует использовать команду close().

Обработка набора записей ADO для построения формы ввода данных: sub MakeDataEntryTable

После вызова подпрограммы ShowUserRecordset страница ReadWriteDB.asp размещает элемент формы HTML на странице браузера, позволяющей пользователю отправлять данные на сервер. Подпрограмма AddData осуществляет прием данных, отправленных из HTML-формы на веб-странице. Форма HTML, используемая для получения данных от пользователя, должна соответствовать обновляемой форме набора данных. В данной ситуации информации, вводимой пользователем для отправки на сервер, присваиваются те же имена, что в полям в таблице базы данных, к которой они относятся. Подпрограмма MakeDataEntryTable создает таблицу HTML, содержащую заголовки с именами полей набора записей, являющиеся частью набора записей, сгенерированного переданным в подпрограмму SQL-выражением. Эта подпрограмма использует для построения таблицы HTML такой же механизм цикла, как и подпрограмма ShowUserRecordset. Обратитесь к листингу 12.10 для изучения кода подпрограммы MakeDataEntryTable.

'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
'sub MakeDataEntryTable
'Using the SQL command and the Connection object 
'instance passed in, prints a table with the field  
'names for the headings and inputs for the fields.
'
'in 
'      sSQL = SQL command for recordset   
'     oConnection = ADO connection object
'out - nothing - writes to client
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
sub MakeDataEntryTable(byval sSQL, byval oConnection)

dim myRecordset
dim sResult
dim oField

     
     'create the recordset
     set myRecordset = Server.CreateObject("ADODB.Recordset")
     myRecordset.Open sSQL, oConnection

     'build a table for user to enter values
     sResult = "<TABLE BORDER=0 CELLSPACING=0 CELLPADDING=0 >" &_
                                                        vbCRLF
     sResult = sResult & "<TR>"
     
     'make the headings
     for each oField in myRecordset.Fields
          sResult = sResult & "<TH>" & oField.Name & "</TH>"
     next 
     
     'make a new row
     sResult = sResult & "</TR>" & vbCRLF & "<TR>"
     
     'make the user inputs
     for each oField in myRecordset.Fields
          sResult = sResult & _
                    "<TD> <input TYPE=""text"" NAME=""" & _
                    oField.Name & """ VALUE=""""></TD>"
     next 

     sResult = sResult & "</TABLE>"

     Response.Write(sResult)

     'shut down recordset and connection objects
     myRecordset.Close()
     
end sub
Листинг 12.10. Part of ReadWriteDB.asp - MakeDataEntryTable Subroutine Serializing a Recordset into an HTML Table

Выполнение ReadWriteDB.asp приведет к построению в браузере страницы, отображающей имеющиеся в таблице базы данных значения, строку, таблицу с именами полей и поля ввода во второй строке, а также кнопку Add (Добавить). Нажатие на кнопку Add (Добавить) без ввода данных во все текстовые поля приведет к обновлению страницы. При вводе данных во все четыре поля эти данные запишутся в таблицу базы данных tblEmployee. На рисунке 12.12 изображена страница ReadWriteDB.asp с введенными в нее данными.


Рис. 12.12.

Методы программирования: абстракция логики и расширяемость. Подпрограммы ShowUserRecordset и MakeDataEntryTable обеспечивают поддержку любого набора записей или объекта подключения. Их можно использовать в других приложениях, где требуется реализация таких же действий без изменения кода. При изменении формы таблицы базы данных эти подпрограммы будут функционировать без корректирования кода.

Тем не менее, возможности данных подпрограмм довольно ограничены при их использовании в других приложениях, поскольку они содержат логику отображения. Веб-приложения для своей работы требуют наличия альтернативного пользовательского интерфейса. При абстрагировании логики представления от подпрограмм последние стали бы намного полезнее при работе в широком спектре приложений. Код, который можно применить к широкому ряду приложений, называется расширяемым. Обобщение различных компонентов логики значительно увеличивает уровень расширяемости в коде, но, как правило, отрицательно сказывается на производительности и скорости разработки.

< Лекция 11 || Лекция 12: 123456789
Александр Тагильцев
Александр Тагильцев

Где проводится профессиональная переподготовка "Системное администрирование Windows"? Что-то я не совсем понял как проводится обучение.

Владимир Кирин
Владимир Кирин
Неполодки на ресурсе.При сдаче 7 теста, открывается пустое окно, и ничего не происходит.Поправте пожалуйста. При этом попытка считается защитана, перездача только через 30 мин. Использую браузер опера.
Александр Титов
Александр Титов
Россия, Москва
Игорь Соловьев
Игорь Соловьев
Россия, Братск