标题标题  显示论坛会员列表名单  搜索论坛搜索  HelpHelp
  注册注册  登入登入
ASP教学区
 DoReMe : ASP教学区
主题 话题: 第二十三章 操作记录集 回复发表新主题
作者
贴子内容 << Prev Topic下一个主题 >>
erisa
Groupie
Groupie


加入: 2005/2月/16
Online Status: Offline
回复: 43
Posted: 2005/2月/16 11:51上午 | IP记录 引用 erisa

在第22章「Activex数据对像」中,你学习了如何使用ADO连接对像打开一个数据库连接。你还学习了如何用一个打开的连接 执行SQL命令和返回记录集。但是,操作记录集对象的方法并没有讨论。

这一章讲述如何使用记录集对象。在第一节,你将学习用这种对像显示数据的基本方法。在第二节,你将学习如何用各种不同类型的光标 和锁定打开一个记录集。最后,第三节讲述了许多操作记录集中记录的高级方法。

Back to Top 查看 erisa's 资料 搜索其它贴子 erisa 访问 erisa's
 
erisa
Groupie
Groupie


加入: 2005/2月/16
Online Status: Offline
回复: 43
Posted: 2005/2月/16 11:52上午 | IP记录 引用 erisa

用记录集显示记录

记录集可以用来代表表中的记录。与表一样,一个记录集包含一条或多条记录(行),每个记录包括一个或多个域(字段)。在任何时刻 ,只有一条记录是当前记录。

要创建记录集对象的一个实例,你可以使用连接对象的Execute()方法。当你用Execute()方法从一个数据库返回查询 结果时,一个记录集对像会被自动创建。这里有一个例子:

 

<%

Set MyConn=Sever.CreateObject(「ADODB.Connection」)

MyConn.Open 「FILEDSN=d:\Program Files\

Common Files\ODBC\Data Sources\MyData.dsn」

Set RS=MyConn.Execute(「SELECT * FROM Mytable」)

RS.Close

MyConn.Close

%>

 

在这个例子中,使用一个SQL SELECT语句从一个表Mytable中返回了所有的记录。Execute()方法返回一个记录集。在这个脚本中,该记录集被 分配给变量RS,然后关闭了这个记录集。最后,关闭与数据库的连接。

记录集中的每一条记录都对应于表Mytable中的一条记录。要显示记录集中的所有记录,你只要简单地做一个循环就可以,如下例 所示:

 

<%

Set MyConn=Sever.CreateObject(「ADODB.Connection」)

MyConn.Open 「FILEDSN=d:\Program Files\

Common Files\ODBC\Data Sources\MyData.dsn」

Set RS=MyConn.Execute(「SELECT * FROM Mytable」)

WHILE NOT RS.EOF

Response.Write(「<BR>」&RS(「Mycolumn」))

RS.MoveNext

WEND

RS.Close

MyConn.Close

%>

 

在这个例子中,WHILE……WEND循环用来扫瞄记录集RS中的每一条记录,把每个记录的Mycolumn域输出到浏览器。这 段脚本显示了表Mytable中的所有记录。

当一个记录集对像中收集了数据时,当前记录总是第一条记录。在上面的例子中,调用了记录集对象的MoveNext方法,使当前记 录移到下一条记录。当所有的记录都显示完时,记录集对象的EOF属性的值将变为true,从而退出WHILE……WEND循环。

一个记录集对像有一个域集合,包含一个或多个域对象。一个域对像代表表中的一个特定的字段。例如,在上面的脚本中,使用了表达式 RS(「Mycolumn」)来显示字段Mycolumn。实际上,你可以通过许多中途径显示一个字段的值。下面的每一个表达式 都可以显示字段Mycolumn的值:

 

RS(「Mycolumn」)

RS(0)

RS.Fields(「Mycolumn」)

RS.Fields(0)

RS.Fields.Item(「Mycolumn」)

RS.Fields.Item(0)

 

注意你既可以通过字段名,也可以通过顺序号来指定一个字段。例如,你可以使用RS(「Mycolumn」)或RS(0)来代表字 段Mycolumn.两种方法起到同样的效果,因为字段Mycolumn对应于表中的第一个字段(第一个字段的顺序号是0)。

当你不知道一个记录集中的字段名时,通过顺序号指定一个域是有用处的。例如,下面的ASP脚本显示了一个表中的所有记录的所有字 段(见图23.1):

 

<HTML>

<HEAD><TITLE>Show All Rows And Columns</TITLE></HEAD>

<BODY>

<%

Set MyConn=Sever.CerateObject(「ADODB.Connection」)

MyConn.Open 「FILEDSN=d:\Program Files\

Common Files\ODBC\Data Source\MyData.dsn」

Set RS=MyConn.Execute(「SELECT * FROM Mytable」)

%>

<TABLE BORDER=1>

<TR>

<% FOR i=0 to RS.Fields.Count-1 %>

<TH><% =RS(i).Name *></TH>

<% Next %>

</TR>

<% While Not RS.EOF %>

<TR>

<% FOR i=0 TO RS.Fields.Count-1 %>

<TD><% = RS(i) %></TD>

<% Next %>

</TR>

<%

RS.MoveNext

WEND

RS.Close

MyConn.Close

%>

</TABLE>

</BODY>

</HTML>

 

 

 

图23.1 显示一个数据表中的所有的记录

 

 

 

在这个例子中,域集合的Count属性用来返回该记录集中的域的数目。Name属性用来返回每个域的名字。两个FOR……NEX T循环用来对记录集中的所有字段进行操作。不论表中有多少记录和字段,它们将被全部显示。

Back to Top 查看 erisa's 资料 搜索其它贴子 erisa 访问 erisa's
 
erisa
Groupie
Groupie


加入: 2005/2月/16
Online Status: Offline
回复: 43
Posted: 2005/2月/16 11:53上午 | IP记录 引用 erisa

记录集光标和锁定类型

你可以用四种类型的光标打开一个记录集。光标决定了你可以对一个记录集进行什么操作。光标还决定了其它用户可以对一个记录集进行 什么样的改变。下面列出了光标的不同类型和限制:

 


adOpenFowardOnly。使用前向光标,你只能在记录集中向前移动。


adOpenKeyset。使用Keyset光标,你可以在记录集中向前或向后移动。如果另一个用户删除或改变了一条记录,记录 集中将反映这个变化。但是,如果另一个用户添加了一条新记录,新记录不会出现在记录集中。


adOpenDynamic。使用动态光标,你可以在记录集中向前或向后移动。其它用户造成的记录的任何变化都将在记录集中有所 反映。


adOpenStatic。使用静态光标,你可以在记录集中向前或向后移动。但是,静态光标不会对其它用户造成的记录变化有所反 映。

 

在缺省情况下,当你打开一个记录集时,将用前向光标打开它。这意味著你只能用MoveNext方法在记录集中向前移动。对记录集 的其它操作将不受支持。

前向光标的好处是它比较快。无论何时,如果前向光标可以实现你的要求,你就应该使用前向光标。但是,如果你需要用功能更强的光标 打开记录集,你可以使用如下的脚本:

 

<!--#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

RS.Close

MyConn.Close

%>

 

要用一种特定的光标打开记录集,你必须显式地创建这个记录集。然后用该光标类型打开它。要做到这一点,你首先要创建记录集对象的 一个实例。接下来,你要用Open方法,通过一个连接和一种光标类型,打开这个记录集。在这段脚本中,用连接对像MyConn和 一个动态光标打开了记录集RS。

打开记录集时,你也可以指定锁定类型。锁定类型决定了当不止一个用户同时试图改变一个记录时,数据库应如何处理。你可以指定下面 的四种锁定类型:

 


adLockReadOnly。指定你不能修改记录集中的记录。


adLockPessimistic。指定在编辑一个记录时,立即锁定它。


adLockOptimstic。指定只有调用记录集的Update方法时,才锁定记录。


adLockBatchOptimstic。指定记录只能成批地更新。

 

在缺省情况下,记录集使用只读锁定。要指定不同的锁定类型,你可以在打开记录集时包含这些锁定常量之一。这里有一个例子:

 

<!--#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,adLockPessimistic

RS.Close

MyConn.Close

%>

 

这个脚本与上一个基本相同,只是增加了锁定类型。当打开记录集RS时,将使用adLockPessimistic锁定。这意味著 这个记录集中的记录可以被修改。(下一集中将讨论如何修改)

最后,打开一个记录集时,你可以指定一个Options参数。Options参数标明用来打开记录集的命令字符串的类型。告诉A DO被执行的字符串内容的有关信息有助于高效地执行该命令字符串。

你可以使用下面的常量作为Options参数:

 


adCMDTable。被执行的字符串包含一个表的名字。


adCMDText。被执行的字符串包含一个命令文本。


adCMDStoredProc。被执行的字符串包含一个存储过程名。


adCMDUnknown。不指定字符串的内容。(这是缺省值。)

 

在下面的脚本中,Options参数用来告诉ADO,命令字符串的内容是命令文本:

 

<!--#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.Close

MyConn.Close

%>

Back to Top 查看 erisa's 资料 搜索其它贴子 erisa 访问 erisa's
 
erisa
Groupie
Groupie


加入: 2005/2月/16
Online Status: Offline
回复: 43
Posted: 2005/2月/16 11:53上午 | IP记录 引用 erisa

操作记录集的高级方法

到现在为止,你只学习了如何用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属性。下面的A SP网页演示了该如何实现:

 

<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属性确定是否有密码存在。如果RecordCou nt大于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,说明用户输入的密码不在保存密码的表中。

在某些情况下,你的确需要返回记录数目。例如,你也许想显示在你站点上注册的用户总数。但是同样,你应该避免使用RecordC ount属性。取而代之,你可以执行一个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存储过程返回记录数目的方法。参见「在命令对像中使用返回状态值」一节。

 

对记录集进行分页

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

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

 


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网页中使用记录集对像显示表中的数据。你还学会了如何用不同类型的光标和锁定打开 记录集。最后,你学习了记录集对象的一些高级方法。

Back to Top 查看 erisa's 资料 搜索其它贴子 erisa 访问 erisa's
 

如果你想回复的话你必须首先 login
如果你还没有注册的话你必须首先 注册

  回复发表新主题
显示可打印的页面 显示可打印的页面

论坛跳转
不能 张贴新论题在这个讨论版
不能 回应论题在这个讨论版
不能 删除你的发言在这个讨论版
不能 编辑你的发言在这个讨论版
不能 新增投票标题在这个讨论版
不能 在这个讨论版投票

Edit by doreme Forums version 2004
Welcome ©2001-2004 doreme Guide

This page was generated in 0.1563 seconds.

 
保养品
保养品, Skin Care
www.elady.tw
美材批发
美材, Cosmetic
www.elady.tw/beauty_org
保养品批发
名牌保养品、保养品批发
gb.perfume.com.tw/skincare
饰品批发
饰品、饰品批发
gb.perfume.com.tw/ornament