excel VBA通过遍历ADODB结果集删除记录

chhkpiq4  于 2022-12-24  发布在  其他
关注(0)|答案(1)|浏览(256)

我试图循环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
4uqofj5v

4uqofj5v1#

我没有看到ytdRS.open命令,这是问题的一部分吗?
编辑:还有几件事:
1.您在整个块中没有使用相同的记录集名称(ytdRS),所以我不确定您是否打算使用两个不同的记录集(我假设不是)
1.我不确定"Value"是指记录集中某个字段的值(例如ytdRS!FieldName.Value)还是变量名,在这里它是变量名。
1.无论哪种方式,通过在if语句中使用MoveNext,几乎可以保证会遇到死循环,因为除非Value等于1,否则记录集不会移动到下一条记录。
1.我不得不修改CursorType和LockType来使您的示例在测试表上工作。我不认为adOpenStatic将允许您删除记录(我相信它提供了一个静态或不可更改的游标)。当您在更新数据时遇到问题时,adOpenKeyset通常似乎是一种解决办法。您用于锁定的adLockBatchOptimistic假设您在批处理模式下操作;通常adLockOptimistic工作正常。如果需要,请参阅here了解有关Delete方法和批处理操作的更多信息。
下面的代码对我有效;你必须根据你的应用程序来编辑它,特别是你需要编辑ytdRS.SourceOpen()方法中的ActiveConnection:=,以及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

相关问题