所以,你有一个像这样创建的记录集:
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
你为什么这么问?好吧,我们有一个较旧的网站,我们正在更新和添加新功能,而不是更改大量的代码我想知道我是否可以偷偷摸摸并使用已创建(大)记录集的setset,以节省另一个查询到数据库等等。只是想知道它是否可以完成。
谢谢,
答案 0 :(得分:3)
您可以使用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
属性设置为您的书签数组,并且您拥有自定义筛选的记录集。
'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有点棘手。我所做的是过去是使用不在数据中的分隔符(例如管道|
)来组合多个字段。但这并不总是可行的。
答案 1 :(得分:0)
记录集对象只能由“连接”对象打开,你不能用另一个记录集对象替换连接对象,如上所示,但是如果修改查询字符串对象并通过自己的查询打开所需的子集就可以实现此
如果您在制作子集时遇到困难,请发布查询字符串。
答案 2 :(得分:0)
显然你可以创建第二个查询和记录集并在“do while not rs.eof ............ loop”中一遍又一遍地运行它 - 我猜这就是你想要的避免。
您可能想看看Datashaping。这里有一篇关于它的文章。这是旧的,但这是经典ASP
http://www.4guysfromrolla.com/webtech/092599-1.shtml
在MSDN上也曾经有一个名为“使用数据形状来创建分层记录集”的页面。您可以在Google上找到大量链接,但它们都会将您带到.net开发人员的资源上的404页面:(