经典的asp查询是记录集而不是表



因此,您有一个这样创建的记录集:

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>。您可以使用ANDOR组合多个表达式,但即使这样也有一些限制(有关详细信息,请参阅文档链接)。

对于更复杂的筛选,可以将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开发者使用:(

最新更新