<% ASP на блюдечке %>. Часть 6

Свойство Name

Свойство Name (Имя) используется для указания имени столбца таблицы базы данных, например:

<%
 howmanyfields = rs.fields.count - 1
 for I = 0 to howmanyfields
  Response.Write rs.fields(i).name
  Response.Write “<BR>”
 next
 %> 

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

В начало

В начало

СвойствоValue

Свойство Value содержит значение, выбранное из поля таблицы. Для определения текущего типа представления данных предназначено свойство Type. Если данные в программе, в зависимости от их типа, должны обрабатываться по-разному, свойство Type может быть использовано для выбора варианта обработки. Подобные действия необходимо осуществлять перед выполнением сравнений, вычислением значения выражений и т.п. Приведем несколько примеров выражений с использованием значений полей таблицы. Например, выражение

 If rs.Fields("Article").value <> "No Text"    Then… 

позволяет сравнить значение, хранящееся в поле Article, с текстовой константой «No Text».

If rs.Fields("Article").type = "int" Then… 

Позволяет определить, является ли тип поля Articles целочисленным.

В начало

В начало

Методы AddNew и Update

Пара методов, AddNew и Update, позволяет добавлять новую запись к объекту Recordset и заносить значение ее полей перед добавлением в базу данных. После вызова метода AddNew полям новой записи присваиваются требуемые значения и вызывается метод Update, сохраняющий эти данные в таблице. Если не вызывать метод AddNew, вместо добавления новой записи будет выполнено обновление полей текущей записи объекта Recordset. Рассмотрим пример использования пары методов, AddNew и Update:

<%
 …
 Rset.AddNew  
Rset.Fields (“PinCode”) = 12107880
 Rset.Update
 …
 %>

При использовании комбинации методов AddNew/Update можно получить практически тот же результат, что и при применении SQL-команды  INSERT INTO посредством метода Execute объекта Command, с одним только отличием. Оно состоит в том, что после вызова метода Update состояние объекта Recordset обновляется и в него добавляется новая строка, в то время как при использовании команды INSERT INTO требуется дополнительно выполнять обновление текущего объекта Recordset для того, чтобы в него попали только что введенные значения. Оба подхода равнозначны, однако подход с использованием метода AddNew следует считать более последовательным и лучше выдержанным в том стиле, который используется в технологии ADO для работы с базами данных и их таблицами. Можно вызвать метод AddNew и внести изменения в объект Recordset, после чего вновь вызвать метод AddNew, прежде чем обратиться к методу Update. В этом случае ADO автоматически вызовет метод Update до выполнения очистки текущей записи объекта Recordset с целью вставки новой записи. Однако при добавлении записей все же рекомендуется всегда явно вызывать метод Update. В результате вы будете иметь гарантию того, что все внесенные изменения зафиксированы в базе данных. Более того, данный стиль программирования обеспечивает более читаемый код.

В качестве параметра методу AddNew  можно передать коллекцию типа Fields. Это вызовет одновременное обновление нескольких полей. В данном случае ADO переключает функцию обновления в режим  Batch. Для внесения новых записей в базу данных, вместо вызова метода  Update, в данном случае потребуется метод UpdateBatch. То же самое следует применять и при одновременном добавлении значений нескольких полей в запись таблицы, к примеру:

<%
 …
 Dim oRS
 
 set oRS=server.CreateObject("adodb.recordset")
 oRS.Open "BoatClass", "DSN=Sailors", adOpenDynamic, adLockPessimistic
 
 oRS.AddNew
 oRS("ClassName") = varClassName
 oRS("ClassLength") = varClassLength
 oRS("ClassWeight") = varClassWeight
 oRS("ClassEntered") = varClassEntered
 oRS.UpdateBatch   
…
 %> 

SQL-альтернативой использованию методов AddNew / Update, как уже отмечалось, служит SQL-оператор Insert:

<%
 …
  sqlQuery = "INSERT INTO Orders (StaffID, SKU, Qty, OrderDate) Values ('" & Session("StaffID") & "','" & Request.QueryString("SKU") & "',1,'" & date & "')"
 On Error Resume Next
  set rs = conn.Execute(sqlQuery)
 rs.Close  
…
 %>
В начало

В начало

Метод Close

Как и в других объектах ADO, метод  Close объекта Recordset  закрывает этот объект и освобождает все связанные с ним ресурсы. По окончании работы с объектом Recordset его нужно обязательно закрыть, поскольку при этом освобождаются ресурсы и на стороне сервера. (Данные ресурсы необходимо освобождать как можно раньше, это снижает  конкуренцию за владение ими среди многочисленных пользователей базы данных.) И рекомендуется при закрытии присваивать указателю на объект Recordset константу Nothing, поскольку именно при этом производится фактическое удаление указателя на экземпляр объекта.

Например:

Rset.Close
 Set Rset = Nothing
В начало

В начало

Метод Delete

Метод Delete предназначен для удаления текущей строки из объекта Recordset и связанной с ним таблицы в базе данных. При использовании метода Delete можно заранее определять условия для удаления нескольких записей из базы данных с помощью свойства Filter, предварительно поместив в него критерий удаления.

Если удаление записей выполняется в пакетном режиме (удаляется сразу несколько записей), то для фактического удаления из таблицы базы данных записей, отмеченных к удалению, следует вызвать метод UpdateBatch. Если этого не сделать, изменения будут утеряны и записи не будут удалены из таблицы.

Несмотря на это, альтернативный вариант удаления с использованием SQL-команды используется довольно часто:

…
   strSQL = "Delete * from Clubs Where ClubCode = '" & _
   Request.Form("cboClubs") & "'"
   Set objConn = Server.CreateObject("ADODB.Connection")
   objConn.Open "DSN=Sailors"
   Set objCmd = Server.CreateObject("ADODB.Command")
   Set objCmd.ActiveConnection = objConn
   objCmd.CommandText = strSQL
   objCmd.CommandType = adCmdText
   objCmd.Execute
   … 
В начало

В начало

Методы MoveFirst, MoveLast, MoveNext и MovePrevious

При использовании в технологии ADO следует четко понимать назначение методов MoveFirst, MoveLast, MoveNext и MovePrevious. Эти методы предназначены для навигации среди записей объекта Recordset путем перемещения среди записей и элементов выбранного из базы набора данных.

Из названия свойства RecordCount (Счетчик строк) следует, что для получения конкретного значения числа строк в объекте Recordset следует предварительно вызвать метод MoveLast. Причина в том, что содержимое буфера объекта Recordset и способ его связи с исходными таблицами динамически изменяются. До тех пор пока из источника данных не будут получены все выбранные строки, драйвер доступа к базе данных не сможет определить их общее количество. В целом назначение отдельных методов Move понятно из их названия. Каждый из них обеспечивает определенный тип перемещения в буфере данных объекта Recordset.

MoveFirst — используется для перемещения к первой записи в наборе данных Recordset. При вызове этого метода свойству BOF автоматически присваивается значение  TRUE.

MoveLast — используется для перемещения к следующей записи  в наборе данных Recordset. При вызове этого метода свойству EOF  автоматически присваивается значение TRUE.

Пример использования MoveNext и MoveLast — подпрограмма корректной установки курсора на последнее значение:

SUB MoveNext_OnClick
  On Error Resume Next
  ADC.Recordset.MoveNext
  IF ERR.Number <> 0 THEN
                 ADC.Recordset.MoveLast
  END IF
 END SUB 

MoveNext — используется для перемещения к следующей по отношению к текущей позиции в наборе данных Recordset записи. Если при этом будет достигнут конец набора данных, свойству  EOF будет присвоено значение TRUE. Если требуется установить условие  EOF искусственно, следует вызвать метод MoveLast для перехода к последней записи набора данных.

MovePrevious — используется для перемещения к предыдущей по отношению к текущей позиции в наборе данных Recordset записи. Если при этом достигнуто начало набора данных,  свойству  BOF будет присвоено значение  TRUE. Если требуется установить условие  BOF искусственно, следует вызвать метод  MoveFirst для перехода к первой записи набора данных. Пример использования MoveFirst и MovePrevious —  подпрограмма корректной установки курсора на первое значение:

SUB MovePrev_OnClick
  On Error Resume Next
  ADC.Recordset.MovePrevious
  IF ERR.Number <> 0 THEN
                 ADC.Recordset.MoveFirst
  END IF
 END SUB 
В начало

В начало

Метод Open

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

RSet.Open SQL-команда, соединение, тип_курсора, тип_блокировки, режим

Вместо параметра SQL-команда указывается одна или несколько команд языка SQL, разделяемых точкой с запятой. Эта команда будет либо использована для выработки информации из таблиц базы данных, либо переделана для обработки и выполнения ядру базы данных. Обратите внимание, что нет необходимости передавать на выполнение команду  SELECT. Вместо этого можно указать имя таблицы базы данных или имя используемой хранимой процедуры и одновременно установить соответствующее значение в параметре «режим». Кроме того, можно сделать ссылку на уже существующий объект Command и использовать его как источник информации для данного объекта Recordset.

В параметре «соединение» указывается имя уже существующего объекта Connection. Если имя объекта соединения не будет указано, для данного объекта Recordset будет установлено новое соединение. При этом, если не будет предоставлена строка определения параметров соединения, установка нового соединения будет связана с новым подключением к серверу, которое будет учитываться последним как очередная выданная лицензия на подключение. В свете этих замечаний рекомендуется всегда ссылаться на уже существующий объект Connection.

В начало

В начало

Метод Update

Метод Update используется как для добавления новых строк (совместно с методом AddNew), так  и для изменения строк, уже существующих в буфере объекта Recordset. После вызова метода AddNew для вставки пустой записи и заполнения ее полей требуемыми значениями следует вызвать метод Update для помещения новой записи в таблицы базы данных.

Если требуется изменить уже существующую запись, следует найти эту запись в буфере и внести в нее необходимые изменения. Завершив обновление, надо вызвать метод Update для фиксации внесенных изменений в таблицах базы данных.

В начало

В начало

Свойство BOF

Если значение этого свойства равно True, значит в настоящий момент указатель записи объекта Recordset установлен на начало файла или на первую запись в наборе. Эта ситуация всегда происходит после вызова метода  MoveFirst.

В начало

В начало

Свойство EOF

Если значение этого свойства равно True, значит в настоящий момент указатель записи объекта Recordset установлен на конец набора данных. Эта ситуация всегда имеет место после вызова метода  MoveLast. Кроме того, данная ситуация возникает при использовании метода  MoveNext для последовательной обработки записей буфера, после того как обработаны все записи в буфере.

Свойства BOF и EOF являются ключевыми, и без них не обходится ни одно приложение. Эти свойства, как правило, используются в двух случаях:

  • Когда необходимо осуществить проход по всем элементам набора данных (выполнить определенные операции над всеми элементами набора данных). К примеру:
    Do While iRecordsShown < iPageSize And Not RS.EOF
       tid=rs("thread_id")
       ParentID=rs("id")
       name=rs("name")
       email=rs("email")
       subject=rs("subject")
       mesdate=rs("mesdate")
       response.write "<tr><td>"
       response.write image & "<a href='show.asp?id=" & parentID &_
                                              "&fid="&fid&"&tid="&tid&"'>" & subject &_
                                              "</a>" & "...." & mesdate & "...." &  name & "</a>"
       response.write "</tr></td>"
       rs.movenext
       iRecordsShown = iRecordsShown+1
     Loop 
  • Когда необходимо установить, пуст ли набор данных, а если нет, то выполнить определенные действия над одним-единственным элементом набора данных. К примеру:
    …
       SQLQuery = "SELECT * FROM Flights WHERE TimesID = " & Request("DateTime")   
      set rsFlights = conn.Execute(SQLQuery)
         if rsFlights.eof then
           rsFlights.close
           set rsFlights = nothing
           Response.write("<p>Sorry, this flight is not available    now!")
           Response.write("<br /><anchor title='")
           Response.write("ReStart'")
           Response.write(">Go Home to Restart-><go href='")
           Response.write("index.asp'")
           Response.write("/></anchor>")
           Response.write("</p></card></wml>")
           Response.end
       end if
       … 
В начало

В начало

Свойство RecordCount

В свойство RecordCount помещается общее число записей набора данных объекта Recordset. Следует заметить, что, пока для перемещения в пределах буфера данных объекта Recordset не будет использован метод  MoveLast или MoveNext, значение этого свойства будет соответствовать максимальному количеству просмотренных строк.

В начало

В начало

Свойство PageCount, PageSize и AbsolutePage

Набор этих свойств имеет колоссальное значение при разработке поисковых машин. Ведь результатом запроса пользователя может явиться огромное множество записей, и тогда имеет смысл предоставить пользователям возможность постраничного доступа к результатам запроса (составить интерфейс вида 1-5, 5-10, 10-15 и т.д). Для организации системы подобного доступа и применяются свойства PageCount, PageSize и AbsolutePage объекта RecordSet. Давайте рассмотрим, каким образом такую систему можно разработать самостоятельно:

<%@ LANGUAGE="VBScript" %>
   <%Response.Expires=0%>
   ' Будем обновлять страницу всякий раз, когда к ней будет происходить обращение
   …
   <%
   ' Получить номер текущей страницы 
Select Case Request.QueryString("NPage")
      Case ""
          Session("CurrentPage") = 1         ' Мы на первой странице
      Case "Next"
          Session("CurrentPage") = Session("CurrentPage")    + 1       ' Мы перешли на следующую страницу
      Case "Previous"
          Session("CurrentPage") = Session("CurrentPage")    - 1                      ' Мы перешли на следующую страницу
   End Select 
' Определим переменные и константы 
Dim objConnection
   Dim objRecordset
   Const adOpenKeyset = 1
   
   ' Откроем базу данных 
Set objConnection = Server.CreateObject("ADODB.Connection")
   objConnection.Open "Articles", "sa", "" 
Dim strSQL 
strSQL = strSQL & "SELECT Articles.Title, Titles.Title, "
   strSQL = strSQL & "Editors.EditorName FROM Authors, Titles, Publishers"
   strSQL = strSQL & "WHERE Authors.ID = 5 "
   strSQL = strSQL & "AND Titles.LetterIndex = 'L' "
   strSQL = strSQL & "AND Editors.Edition LIKE `OREILLY' "
   strSQL = strSQL & " ORDER BY Articles.Title"
   
 
Set objRecordset = Server.CreateObject("ADODB.Recordset")
   objRecordset.PageSize = 10
   objRecordset.Open strSQL, objConnection, adOpenKeyset
   objRecordset.AbsolutePage = CLng(Session("CurrentPage"))
   
   ' Просмотрим результаты запроса 
%>
   
   <P>Page <%=Session("CurrentPage")%> of <%=objRecordset.PageCount%></P>
   <TABLE BORDER>
   
   <TR>
   <TH>Автор</TH><TH> Заголовок</TH><TH>Редактор</TH>
   </TR>
   
   <%
   Dim I
   For i = 1 To objRecordset.PageSize
   ' Для каждого элемента страницы
   %>
   
   <TR>
   <TD><%=objRecordset("Author")%></TD>
   <TD><%=objRecordset("Title")%></TD>
   <TD><%=objRecordset("EditorName")%></TD>
   </TR>
   
   <%
   objRecordset.MoveNext
   Next
   %> 
</TABLE> 
<%
    If CLng(Session("CurrentPage")) < objRecordset.PageCount    Then
   ' Если число виртуальных страниц пока не исчерпано,
   ' то сформируем ссылку на файл с этим исходным кодом
   ' и присвоим параметру значение
   %> 
<P><A HREF="thisfilename.asp? NPage=Next">Вперед</A></P>  
<% End If %>
   <% If CLng(Session("CurrentPage")) > 1 Then %>
   <P><A HREF=" thisfilename.asp? NPage=Prev">Назад</A></P>
   <%End If%> 
<%
   objRecordset.Close
   objConnection.Close
   Set objRecordset = Nothing
   Set objConnection = Nothing
   %>
   … 
В начало

В начало

Что же такое ADO+?

ADO+ по своей сути — результат эволюции Microsoft ActiveX Data Objects (ADO), позволяющий создавать многоплатформенные приложения для доступа к разнообразным базам данных. Давайте попытаемся осознать лишь «надводную часть айсберга различий», которую нельзя не заметить «невооруженным глазом».

В частности, ключевым отличием является опора на XML (Extensible Markup Language) именно как на формат передачи данных и, как следствие, на то обстоятельство, что любое приложение, способное воспринимать формат XML, может обрабатывать данные. И еще здесь значительно улучшен синтаксис программирования (по сравнению с ADO), к примеру, вместо строки:

IF TotalCost > Table(«Customer»).Column(«AvailableCredit») 

может быть использована строка:

IF TotalCost > Customer.AvailableCredit

Помимо того что последнюю строку легче прочитать (она полнее отражает суть решаемой задачи), ее еще и легче написать — не правда ли? Но и это еще не все. Как известно, процессор автоматического заполнения выражений (automatic statement completion) чувствителен именно к программируемым объектам. В частности, теперь можно непосредственно выбрать, к примеру, из появившегося списка, требуемую таблицу только что набранного названия базы данных.

И это обеспечивает не только удобство при наборе, но и повышение  производительности: теперь не нужно искать экземпляр данных среди объектов коллекции ADO (ADO collection) всякий раз, когда требуется обращение к этому экземпляру данных.

Из элементов же «подводной части айсберга отличий» можно указать  концепцию отсоединенного состояния, введенную начиная с версии ADO 2.0. Это позволило разработчикам в значительной степени разгрузить серверы от выполнения вычислений, переложив их на компьютеры клиентов. Здесь весьма уместна параллель с динамическим программированием, когда взаимодействие между сервером и  клиентом частично «смещено» в сторону последнего. Попросту говоря, эта концепция позволяет выполнять определенные операции над копиями наборов данных в памяти компьютера, при нахождении его в неподключенном к БД состоянии. Если вдуматься, то выгода от этого двойная: во-первых, экономится дорогой клиент-серверный канал передачи информации (промежуточные результаты не передаются, операции над наборами данных выполняются локально, а следовательно, быстрее), а во-вторых, сервер освобождается от выполнения вычислительных операций.

В ADO+ эта концепция значительно развита за счет введения нового класса DataSet (далеким потомком объекта RecordSet). Обект DataSet, в частности, позволяет динамически «держать» в памяти копии целой базы данных и выполнять все вычислительные операции именно над этим представлением базы данных, обновляя реальную базу данных лишь время от времени.

Однако мы не будем останавливаться на ADO+ в рамках настоящей публикации, поскольку это тема отдельной (и не одной) статьи…

КомпьютерПресс 2'2001


Наш канал на Youtube

1999 1 2 3 4 5 6 7 8 9 10 11 12
2000 1 2 3 4 5 6 7 8 9 10 11 12
2001 1 2 3 4 5 6 7 8 9 10 11 12
2002 1 2 3 4 5 6 7 8 9 10 11 12
2003 1 2 3 4 5 6 7 8 9 10 11 12
2004 1 2 3 4 5 6 7 8 9 10 11 12
2005 1 2 3 4 5 6 7 8 9 10 11 12
2006 1 2 3 4 5 6 7 8 9 10 11 12
2007 1 2 3 4 5 6 7 8 9 10 11 12
2008 1 2 3 4 5 6 7 8 9 10 11 12
2009 1 2 3 4 5 6 7 8 9 10 11 12
2010 1 2 3 4 5 6 7 8 9 10 11 12
2011 1 2 3 4 5 6 7 8 9 10 11 12
2012 1 2 3 4 5 6 7 8 9 10 11 12
2013 1 2 3 4 5 6 7 8 9 10 11 12
Популярные статьи
КомпьютерПресс использует