【问题标题】:Filtered ADO recordset Do While Not not going in order过滤的 ADO 记录集 Do While Not going in order
【发布时间】:2013-04-26 17:03:38
【问题描述】:

由于某种原因,当我过滤记录集然后启动 Do While Not 循环时,循环首先遍历偶数记录,然后是奇数记录...

例如下面的代码:

sql="SELECT * FROM ProcSaleQueue WHERE Num = '" & salegrouprs("Num") & "' AND Abbr = '" & salegrouprs("Abbr") & "' AND Item_Id = '" & salegrouprs("Item_Id") & "' AND Complete IS NULL ORDER BY ProcSaleId"
salesrs.Open sql, conn,3,3
salesrs.Filter="Complete = NULL"
salesrs.MoveFirst
Do While Not salesrs.EOF
  msgbox salesrs("ProcSaleId")
  'I do some processing things in here.
  salesrs("Complete") = 1
  salesrs.MoveNext
Loop

会输出

72 74 73 75

代替

72 73 74 75

但是当我删除时:

salesrs.Filter="Complete = NULL"

输出是有序的。我正在使用 .Filter 而不是再次查询,因为我必须多次循环遍历这个记录集,而且它是一个巨大的集合,所以我不希望 SQL 服务器有太多的命中。有什么想法吗?

【问题讨论】:

    标签: asp-classic vbscript recordset


    【解决方案1】:

    通过将完成设置为 1,记录不再在过滤器的范围内,因此您在下一条记录上。尝试删除 salesrs.MoveNext

    否则将过滤器放在一起并检查是否完成

    if salesrs("Complete") = 1 then
      salesrs.MoveNext
    else
      'do your stuff
      salesrs("Complete") = 1
    end if
    

    【讨论】:

    • 你检查过这个逻辑吗?删除salesrs.MoveNext 的大多数机会只会导致无限循环。
    • 我最终只是检查是否完成,虽然我希望完全跳过记录,所以我不必浪费时间检查它是否完成。但是,在考虑之后,我怀疑这是否会导致性能损失。
    • 除非你做这些检查数千次,否则不会有性能损失,因为记录在内存中
    【解决方案2】:

    您的.Filter() 毫无意义,因为您已经只选择了 SQL 本身中该字段为 NULL 的记录。

    如果你想把已经处理过的数据放在一边,你可以使用本地数组,例如存储ProcSaleId你可以有:

    Dim arrProcessedProcSaleId()
    ReDim arrProcessedProcSaleId(-1)
    Do While Not salesrs.EOF
        curProcSaleId = salesrs("ProcSaleId")
        msgbox curProcSaleId
    
        For x=0 To Ubound(arrProcessedProcSaleId)
            'Here arrProcessedProcSaleId(x) contains value of already processed ProcSaleId
        Next
    
        'I do some processing things in here.
    
        'store value for later use:
        ReDim Preserve arrProcessedProcSaleId(UBound(arrProcessedProcSaleId) + 1)
        arrProcessedProcSaleId(UBound(arrProcessedProcSaleId)) = curProcSaleId
        salesrs.MoveNext
    Loop
    salesrs.Close
    Erase arrProcessedProcSaleId
    

    您可以拥有任意数量的数组,如果您有很多记录,请确保在完成后有Erase 行以释放用于动态数组的内存。

    【讨论】:

      猜你喜欢
      • 2022-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-07
      • 1970-01-01
      • 2016-12-14
      • 1970-01-01
      相关资源
      最近更新 更多