因此,您有一个这样创建的记录集:
Set rs = Server.CreateObject("ADODB.Recordset")
你这样填写:
rs.Open queryString, AuthConn, adOpenKeyset, adLockReadOnly
我的问题是,我想要第二个记录集,它是第一个(rs)记录集的子集,你能在经典的asp 中做到这一点吗
Set rs2 = Server.CreateObject("ADODB.Recordset")
我的直接猜测是,它会像这个
rs2.Open queryString, rs, adOpenKeyset, adLockReadOnly
你为什么问?好吧,我们有一个旧网站,我们也在更新和添加新功能,而不是更改大量代码,我想知道我是否可以偷偷地使用一个已经创建的(大)记录集的集合,来保存对数据库的另一个查询等。只是想知道是否可以这样做。
谢谢,
您可以使用Clone
方法创建一个重复的记录集,然后使用Filter
将数据集缩减为您感兴趣的数据集。例如:
Dim rs, rs2
Set rs = Server.CreateObject("ADODB.Recordset")
rs.Open queryString, AuthConn, adOpenKeyset, adLockReadOnly
Set rs2 = rs.Clone()
rs2.Filter = "Field1 = 'foo'"
Filter
的字符串形式是基本的;它几乎是<Field> <op> <value>
。您可以使用AND
和OR
组合多个表达式,但即使这样也有一些限制(有关详细信息,请参阅文档链接)。
对于更复杂的筛选,可以将Filter
属性传递给Bookmark
对象的数组。在这种情况下,您将循环遍历记录集(或记录集的克隆),根据任何复杂的条件测试每个记录。如果记录通过了测试,则将其Bookmark
保存到数组或其他集合中。然后,您可以将Filter
属性设置为Bookmarks数组,这样您就有了一个自定义的过滤记录集。
'Note that I haven't tested this code
Dim rs, rs2, bookmarks
Set rs = Server.CreateObject("ADODB.Recordset")
rs.Open queryString, AuthConn, adOpenKeyset, adLockReadOnly
Set rs2 = rs.Clone()
bookmarks = Array()
Do Until rs2.EOF
If rs2("Field1") = 2 * rs2("Field2") Then
ReDim Preserve bookmarks(UBound(bookmarks) + 1)
bookmarks(UBound(bookmarks)) = rs2.Bookmark
End If
rs2.MoveNext
Loop
rs2.Filter = bookmarks
' Now rs2 contains only records where Field1 = 2*Field2
通过使用Dictionary
对象来存储唯一键值,您可以使用相同的技术来获得唯一值(也称为DISTINCT)。在多个字段上执行DISTINCT有点棘手。我过去所做的是使用不在数据中的分隔符(例如管道|
)来组合多个字段。但这并不总是可能的。
记录集对象只能由"连接"对象打开,您不能用如上所示的另一个记录集对象替换连接对象,但是如果您修改querystring对象并通过自己的查询打开所需的子集,则可以实现这一点。
如果您在生成子集时遇到困难,请发布querystring。
显然,您可以创建第二个查询和记录集,并在"do while not rs.eof…………loop"中一遍又一遍地运行它——我猜这正是您想要避免的。
您可能想看看数据整形。这里有一篇关于它的文章。它很旧,但这是经典的ASP
https://web.archive.org/web/20210513001641/https://www.4guysfromrolla.com/webtech/092599-1.shtml
MSDN上曾经有一个名为"使用数据形状创建分层记录集"的页面。你会在谷歌上找到很多链接,但它们都会把你带到一个404页的资源上,供.net开发者使用:(