VBA通过迭代ADODB结果集来删除记录

问题描述 投票:0回答:1

我试图循环ADODB结果集并在条件为真时删除记录。但是,当我这样做时,只删除记录的第一个字段,其余的记录仍然存在。

有任何想法吗?我有以下代码:

Set ytdRS = New ADODB.Recordset
ytdRS.Source = SQL_YTD
ytdRS.CursorType = adOpenStatic
ytdRS.LockType = adLockBatchOptimistic

rst.MoveFirst
Do Until rst.EOF
  if (value = 1) then  
    rst.Delete
    rst.MoveNext
  end if    
Loop
vba excel-vba ado resultset excel
1个回答
0
投票

我没看到的一件事是ytdRS.Open命令。这可能是(问题的一部分)吗?

编辑:其他一些事情:

  1. 你没有在这个块(ytdRS)中使用相同的记录集名称,所以我不确定你的意图是使用两个不同的记录集(我假设它不是)
  2. 我不确定“Value”是否是记录集中字段的值(即ytdRS!FieldName.Value)或变量名。在这种情况下,它是一个变量名称。
  3. 无论哪种方式,你几乎都可以通过在if语句中使用MoveNext来保证你无限循环,因为除非Value等于1,否则你的Recordset不会移动到下一条记录。
  4. 我不得不更改CursorType和LockType以使您的示例在测试表上工作。我不认为adOpenStatic会允许你删除记录(我相信它会为你提供一个静态或不可更改的游标)。当你遇到更新数据的问题时,adOpenKeyset通常似乎是要走的路。您用于锁定的adLockBatchOptimistic假定您以批处理模式运行;通常adLockOptimistic工作正常。有关Delete方法和批处理操作的详细信息,请参阅here(如果需要)。

下面的代码对我有用;您必须根据具体应用进行编辑。特别是你需要编辑ytdRS.SourceActiveConnection:=方法中的Open()ytdRs![Order ID].Value = 36行,以对应你发布的代码块中的“Value”语句。

希望这可以帮助!

请让我知道,如果你有任何问题。

Sub testme()
    Dim ytdRs As ADODB.Recordset
    Set ytdRs = New ADODB.Recordset

    ytdRs.Source = "SELECT * FROM [Order Summary 2]"
    ytdRs.CursorType = adOpenKeyset
    ytdRs.LockType = adLockOptimistic
    ytdRs.Open ActiveConnection:=CurrentProject.Connection

    ytdRs.MoveFirst
    Do Until ytdRs.EOF
      If (ytdRs![Order ID].Value = 36) Then
        ytdRs.Delete
      End If
      ytdRs.MoveNext
    Loop
End Sub
© www.soinside.com 2019 - 2024. All rights reserved.