【问题标题】:classic asp query a recordset rather than a table经典的 asp 查询记录集而不是表
【发布时间】:2013-08-26 02:28:18
【问题描述】:

所以,你有一个这样创建的记录集:

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

你为什么问?好吧,我们有一个旧站点,我们也在更新和添加新功能,而不是更改大量代码,我想知道我是否可以偷偷摸摸地使用一组已经创建的(大)记录集,以保存另一个查询db 等。只是想知道它是否可以完成。

谢谢,

【问题讨论】:

    标签: asp-classic recordset


    【解决方案1】:

    您可以使用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 属性设置为您的书签数组,并且您有一个自定义过滤的记录集。

    '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 有点棘手。我所做的是过去是使用不会在数据中的分隔符组合多个字段(例如管道|)。不过,这并不总是可能的。

    【讨论】:

    • 太好了。你能用'Distinct'吗?我确实做了一些谷歌搜索,但操作数量似乎有限:
    • 不,Filter 属性(我链接到)的文档清楚地说明了允许哪些条件,并且它只是最基本的 SQL 条件。如果您想进行分组和更复杂的操作,您可以考虑使用 Dictionary 对象。
    【解决方案2】:

    记录集对象只能通过“连接”对象打开,不能如上所示将连接对象替换为另一个记录集对象,但是如果修改查询字符串对象并通过自己的查询打开所需的子集,则可以实现这个。

    如果您在制作子集时遇到困难,请发布查询字符串。

    【讨论】:

    • 我认为您不明白我在问什么,我想将结果数据集的一个子集放入另一个记录集中并避免运行第二个查询的开销。
    【解决方案3】:

    显然,您可以创建第二个查询和记录集并在“do while not rs.eof............loop”中一遍又一遍地运行它 - 我猜这就是你想要的避免。

    您可能想看看数据整形。这里有一篇关于它的文章。它很旧,但这是经典的 ASP

    http://www.4guysfromrolla.com/webtech/092599-1.shtml

    以前在 MSDN 上也有一个页面,叫做“使用数据形状创建分层记录集”。您会在 Google 上找到大量指向它的链接,但它们现在都将您带到 .net 开发人员资源上的 404 页面:(

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多