日期:2009-09-03  浏览次数:20907 次

  有时候你会遇到这样的情况,在同一网页中的资料是来自于好几个不同款的资料表, 因此你会为每一个资料表开一个 Recordset ,在这一篇文章将为你介绍另一个替代方案『多重纪录集 (Multiple Recordsets) 』。


  什么是 Multiple Recordsets
  什么是 Multiple Recordsets 呢!简单来说就是将多个 Select 指令合并为一个,而每一个别的指令都以分号(;)隔开, 用这个指令所开启的Recordsets 就是 Multiple Recordset!
  来看个例子,剧情如下:
  使用数据库:SQL 内建北风数据库
  目标:制作三个下拉式选单,分别为「职员名单」、「产品名单」、「产品类别清单」
  你可能会为每一个下拉式选单的创造工作各开启一个 Recordset,相信你一定会觉得很麻烦,又浪费系统资源 现在我们就来看看如何利用 Multiple Recordset 来简化工作
<%
'创造 Recordset 对象
Set oRs = Server.CreateObject("Adodb.Recordset")
'使用 OLEDB Provider, YourSQLServerName 请改为你的服务器名称
sConnString = "Provider=SQLOLEDB;" _
& "Data Source=YourSQLServerName;" _
& "Initial Catalog=northwind;" _
& "User Id=sa;Password="
'多重 Select 指令, 每个指令都以;隔开
sSQL = "select EmployeeID,FirstName from Employees " _
& "order by EmployeeID;" _
& "select ProductID,ProductName from Products " _
& "order by ProductID;" _
& "select CategoryID,CategoryName from Categories " _
& "order by CategoryID"
oRs.Open sSQL, sConnString, 0, 1
i = 1
'利用 Nothing 的特性来检查是否到达最后的 Recordset
Do While Not (oRs is Nothing)
Response.Write "<select name='s" & i & "'>"
& vbCrLf
Response.Write "<option value='>--- 请选择 ---" & vbCrLf
Do While Not oRs.EOF
Response.Write "<option value='" & oRs(0) & "'>"
_
& oRs(1) & vbCrLf
oRs.MoveNext
Loop
Response.Write "</select><p>" & vbCrLf
'将 Recordset 的 Pointer 向下移一位
Set oRs = oRs.NextRecordset
i = i + 1
Loop
%>
  一但我们开启了 Multiple Recordsets,便可以存取第一个 SQL 指令字符串所传回的结果,在外部的 Do Loop 循环中,由于 Multiple Recordsets 并没有类似 EOF 的属性,因此我们使用 Nothing 来判断是否已经到达最后一个 Recordset。而内部的 Do Loop
  循环和一般 Recordset 的处理方式一样,因此不多做说明。 当内部循环结束时,我们呼叫 NextRecordset 方法将 Multiple Recordset 的指针(Pointer)移到下一个 Recordset。

  Multiple Recordsets 的限制
  并不是在所有的数据库或是资料提供者 (Data Provider) 你都可以使用 Multiple Recordsets, 例如,在 Oracle 数据库你就无法使用,其实说穿了就是要用微软的解决方案 ADO+MSSQL 才是绝配,除此之外,也建议你使用 SQL OLEDB Provider,尽可能不要用 ODBC Driver,在某些状况下使用 ODBC Driver 会产生不必要的错误!
  希望这篇文章对你有帮助!