操作记录集的高级方法

到现在为止，你只学习了如何用SQL来修改记录集中的记录。但是，你还可以使用许多记录集方法修改记录集中的记录。下面列出了每种方法的简要说明：

- AddNew。向记录集中添加一条新记录。

- CancelBatch。（当记录集处在批量更新模式时）取消一批更新。

- CancelUpdate。（调用Update之前）取消对当前记录所做的所有修改。

- Delete。从记录集中删除一条记录。

- Update。保存对当前记录所做的修改。

- UpdateBatch。（当记录集处于批量更新模式时）保存对一个或多个记录的修改。

例如，你可以用AddNew方法向一个打开的记录集中添加一条空记录：

<!--#INCLUDE VIRTUAL=

”ADOVBS.inc”-->

<%

Set MyConn=Sever.CreateObject(

“ADODB.Connection”)

Set RS=Sever.CreateObject(

“ADODB.RecordSet”)

MyConn.Open

“FILEDSN=d:\Program Files\

Common Files\ODBC\Data Sources\MyData.dsn

RS.Open

“SELECT * FROM Mytable”,MyConn,adOpenDynamic，adCMDText

RS.AddNew

RS(

“MyColumn”)=”A new column”

RS.Update

RS.Close

MyConn.Close

%>

在这个脚本中，用AddNew方法创建了一条新记录。接着，新记录的MyColumn域被赋值“A new column”。最后，调用Update方法保存新记录。要使用这些方法，记录集必须以只读方式以外的其它锁定方式打开。

你也可以使用SQL INSERT语句向一个表中添加新记录，以取代AddNew方法。通常，使用SQL比使用上述的方法要好一些，因为SQL更加灵活。本书的其余部分将使用SQL来操作数据库中的数据。

遍历记录集

记录集对象有许多在记录之间移动的方法。这些方法的大部分只有在记录集以某种特定的游标打开时才可以使用。下面列出了记录集对象的一些方法及其功能的说明：

- Move NumRecords。在记录集中向前或向后移动指定数目的记录数。

- MoveFirst。移动到记录集的第一条记录。

- MoveNext。移动到记录集的下一条记录。

- MovePrevious。移动到记录集中的上一条记录。

- MoveLast。移动到记录集的最后一条记录。

记录集对象还有许多属性，对遍历记录集是有用处的。同样，许多属性需要特定的游标类型：

- AbsolutePosition。用来设置或读取当前记录在记录集中的位置顺序号。

- BOF。标明当前位置在记录集中的第一条记录之前。

- EOF。标明当前位置在记录集中的最后一条记录之后。

- RecordCount。表示一个记录集中的记录总数。

例如，假设你想在一个记录集中反向移动，你可以使用MoveLast和MovePrevious方法，以及BOF属性。下面的ASP网页演示了该如何实现：

<HTML>

<HEAD><TITLE> Backwards Recordset </TITLE></HEAD>

<BODY>

<!--#INCLUDE VIRTUAL=

”ADOVBS.inc”-->

<%

Set MyConn=Sever.CreateObject(

“ADODB.Connection”)

Set RS=Sever.CreateObject(

“ADODB.RecordSet”)

MyConn.Open

“FILEDSN=d:\Program Files\

Common Files\ODBC\Data Sources\MyData.dsn

RS.Open

“SELECT * FROM Mytable”,MyConn,adOpenStatic

RS.MoveLast

WHILE NOT RS.EOF

Response.Write(

“<BR>”&RS(“MyCOlumn”))

WEND

RS.Close

MyConn.Close

%>

</BODY>

</HTML>

在这个例子中，用静态游标打开记录集。记录集打开后，通过使用MoveLast和MovePrevious方法，该记录集中的所有记录都被显示，直至到达记录集的开头。BOF属性用来检测何时到达记录集的开头。

你可以用这种方法在一个记录集中反向移动，但是，很难想象你有什么理由需要这样做。使用SQL语言自身对查询结果进行排序是有效的。如果你可以，你应该用ORDER BY子句对记录进行排序。（要了解ORDER BY子句的更多内容，请参阅第10章，“SQL基础”）

返回记录数目

你可以用记录集对象的RecordCount属性来确定一个记录集中的记录总数。但是，你应该慎重使用这个属性，因为这个属性在许多情况下效率极低。

对一个用前向游标打开的记录集，你不能使用RecordCount属性。你必须打开一个效率较低的游标才可以使用这个属性，如下例所示：

<!--#INCLUDE VIRTUAL=

”ADOVBS.inc”-->

<%

Set MyConn=Sever.CreateObject(

“ADODB.Connection”)

Set RS=Sever.CreateObject(

“ADODB.RecordSet”)

MyConn.Open

“FILEDSN=d:\Program Files\

Common Files\ODBC\Data Sources\MyData.dsn

RS.Open

“SELECT Mycolumn FROM Mytable”,MyConn,adOpenStatic

Response.Write(RS.RecrdCount)

RS.Close

MyConn.Close

%>

这个脚本输出表Mytable中的记录数目，RecordCount属性用来返回这个数字。为了能使用RecordCount属性，记录集用一个静态游标打开。

通常，你需要一个记录数目的唯一原因是想确定是否至少有一条记录满足特定的条件。例如，你也许想检查一下，是否一个人输入了合法的口令。在这种情况下，你可以查询一个保存口令的表，用RecordCount属性确定是否有口令存在。如果RecordCount大于0，说明有口令存在，否则说明没有，该口令是 非法的。

但是，用EOF属性检测一个查询是否返回了结果将会更好。当用前向游标打开了一个记录集时，你可以使用EOF属性。这里有一个例子：

<!--#INCLUDE VIRTUAL=

”ADOVBS.inc”-->

<%

Set MyConn=Sever.CreateObject(

“ADODB.Connection”)

Set RS=Sever.CreateObject(

“ADODB.RecordSet”)

MyConn.Open

“FILEDSN=d:\Program Files\

Common Files\ODBC\Data Sources\MyData.dsn

RS.Open

“SELECT * FROM Password_Table

WHERE Password=

”&Request.Form(“Password”),Myconn

IF RS.EOF THEN

Response.Write(

“The password you entered is invalid.”)

ELSE

Response.Write(

“Welcome to our web site!”)

END IF

RS.Close

MyConn.Close

%>

在这个例子中，用EOF属性检测是否一个查询有返回结果。如果EOF属性是true，说明用户输入的口令不在保存口令的表中。

在某些情况下，你的确需要返回记录数目。例如，你也许想显示在你站点上注册的用户总数。但是同样，你应该避免使用RecordCount属性。取而代之，你可以执行一个SQL COUNT（*）查询，如下例所示：

<!--#INCLUDE VIRTUAL=

”ADOVBS.inc”-->

<%

Set MyConn=Sever.CreateObject(

“ADODB.Connection”)

Set RS=Sever.CreateObject(

“ADODB.RecordSet”)

MyConn.Open

“FILEDSN=d:\Program Files\

Common Files\ODBC\Data Sources\MyData.dsn

RS.Open

“SELECT COUNT(*) Mycount FORM Password_Table”,MyConn

%>

There are <% =RS(

“MyCount”)%> registered users at the web site.

<%

RS.Close

MyConn.Close

%>

注意这个查询中如何使用字段别名Mycount。通过给集合函数COUNT(*)提供一个名字，你可以在输入查询结果时使用这个名字。

注意

下一章将讨论用SQL存储过程返回记录数目的方法。参见“在命令对象中使用返回状态值”一节。

对记录集进行分页

假设你想显示你站点上销售的一系列商品。但是，你正在经营几百种项目。在这种情况下，你可能不希望把所有的商品显示在同一个ASP页中。这时允许用户进行翻页将是个不错的办法。

记录集对象有三个属性用于此目的。你可以使用这些属性把一个记录集中的记录分成许多逻辑页。通过把记录集中的记录进行分页，你可以一次只显示记录集中的一部分。下面列出了这些属性：

- AbsolutePage。指定当前的页。

- PagePount。返回记录集中的逻辑页数。

- PageSize。指定一个逻辑页中的记录个数，缺省值是10。

要把一个记录集分成多个页，你应使用PageSize属性指定一页中的记录个数。然后你就可以用AbsolutePage属性移动到一个特定的页。最后，PageCount属性可以用来反回总页数。表23.1演示了如何使用这些属性（见图23.2）。

表23.1 pages.asp

<HTML><HEAD><TITLE> Recordset With Pages </TITLE></HEAD><BODY><!-- #INCLUDE VIRTUAL="ADOVBS.inc" --><%' Figure out the current pageIF Request.QueryString("MOVE")="NEXT" THEN Session("CurrentPage")=Session("CurrentPage")+1END IFIF Request.QueryString("MOVE")="PREV" THEN Session("CurrentPage")=Session("CurrentPage")-1END IFIF Session("CurrentPage")="" THEN Session("CurrentPage")=1END IF%><H1>Current Page: <%=Session("CurrentPage")%></H1><HR><%' Open a Connection and RecordsetSet MyConn=Server.CreateObject("ADODB.Connection")Set RS=Server.CreateObject("ADODB.RecordSet")MyConn.Open "FILEDSN=d:\Program Files\Common Files\ODBC\Data Sources\MyData.dsn"' Retrieve the list of productsRS.Open "SELECT ProductName FROM Products", MyConn,adOpenStatic' Set the number of records in a pageRS.PageSize=5' Set the current pageRS.AbsolutePage=Session("CurrentPage")' Show the records for the current pageWHILE NOT RS.EOF AND NumRows<RS.PageSize%><BR>Product Name: <%=RS("ProductName")%><%RS.MoveNextNumRows=NumRows+1WEND%><HR><% IF Session("CurrentPage")>1 THEN %><A HREF="pages.asp?MOVE=PREV"> [PREV] </A><% END IF %><% IF Session("CurrentPage")<RS.PageCount THEN %><A HREF="pages.asp?MOVE=NEXT"> [NEXT] </A><% END IF %><%RS.CloseMyConn.Close%></BODY></HTML>

图23.2 对记录集进行分页

这个ASP网页一次显示表Products中的五条记录一个session变量Currentpage被用来跟踪记录集的当前页。当用户单击NEXT时，就显示下一页记录，当用户单击PREV时，就显示上一页。

把记录取到数组中

在特定情况下，你将需要把记录集中的记录取到数组中。例如，如果你需要修改一个记录集中的数据，担你不想改变记录集中的记录本身，这时你可以把记录取到数组中。

要把一个记录集中的记录分配给一个数组，应使用记录集对象的GetRows()方法。这里有一个例子：

<%

Set MyConn=Sever.CreateObject(

“ADODB.Connection”)

Set RS=Sever.CreateObject(

“ADODB.RecordSet”)

MyConn.Open

“FILEDSN=d:\Program Files\

Common Files\ODBC\Data Sources\MyData.dsn

RS.Open

“SELECT MyFirstCol,MySecondCol FORM Mytable”,MyConn

MyArray=RS.GetRows()

RS.Close

MyConn.Close

%>

在这个脚本中，记录集RS中包含的所有记录被分配给数组MyArray。这个数组由GetRows()方法自动创建并添入数据。GetRows()方法创建了一个二维数组，第一个下标代表字段数，第二个下标代表记录数。

下面的脚本可以用来显示数组MyArray中的内容：

<%

FOR i=0 TO UBOUND(MyArray,2)

%>

<BR> First Column:<%=MyArray(0,i)%>

<BR> Second column:<%=MyArray(1,i)%>

<%

NEXT

%>

VBScript函数UBOUND（）用来确定数组的第二维的维数。FOR

……NEXT循环用来扫描数组的所有元素。这个数组代表一个有两个字段的记录集。当该数组的第一个下标值是0时，代表第一个字段，当第一个下标值是1时，代表第二个字段。

指定记录集的最大容量

假设你想显示在你站点上发布的最后10条信息，但是不能超过10条信息。或者你想显示3个连接，但是不超过3个。如何能够限制取到一个记录集中的记录数？记录集对象有一个属性用于此目的。通过使用MaxRecords属性，你可以限制从一个数据库查询返回到一个记录集中的记录数目。如下例所示：

<%

Set MyConn=Sever.CreateObject(

“ADODB.Connection”)

Set RS=Sever.CreateObject(

“ADODB.RecordSet”)

MyConn.Open

“FILEDSN=d:\Program Files\

Common Files\ODBC\Data Sources\MyData.dsn

RS.MaxRecords=10

RS.Open

“SELECT MyColumn FROM Mytable”,MyConn

WHILE NOT RS.EOF

Response.Write(

“<BR>”&RS(“MyColumn”))

RS.MoveNext

WEND

RS.Close

MyConn.Close

%>

在这个脚本中，MaxRecords属性被设为10。当记录集RS被打开时，不会有超过10个记录被取到RS中。即使表中有10,000条记录，也只有10条记录被取出。使用MaxRecords属性时，你必须在打开记录集之前设置该属性值。记录集打开之后，该属性将成为只读的。

总结

这一章讨论了记录集对象。你学会了如何在ASP网页中使用记录集对象显示表中的数据。你还学会了如何用不同类型的游标和锁定打开记录集。最后，你学习了记录集对象的一些高级方法。