代码之家  ›  专栏  ›  技术社区  ›  jwoolard

Access VBA中的ADO批更新

  •  1
  • jwoolard  · 技术社区  · 15 年前

    我尝试在Access VBA中使用批处理更新。我的代码在每次操作后更新时都可以正常工作,但在尝试对多行操作时失败。我得到的例外是

    “运行时错误”-2147217887(80040E21)“:多步骤OLE DB操作生成错误。检查每个OLE DB状态值(如果可用)。没有做任何工作。”

    我的代码是

    rs.Open "dbrammDump", CurrentProject.Connection, _
                adOpenKeyset, adLockBatchOptimistic
    rowsDel = 0
    Do Until rs.RecordCount < 1
        rs.MoveFirst
        rs.Delete
    
        rowsDel = rowsDel + 1
    Loop
    rs.UpdateBatch
    

    有什么问题吗?

    3 回复  |  直到 15 年前
        1
  •  1
  •   onedaywhen    15 年前

    我认为问题在于您需要显式地使用客户端光标。我怀疑您隐式地使用了服务器端光标。

    我更喜欢单独设置记录集对象的属性,因为我认为读取(因此调试)比使用重载 Open 方法。此外,您还可以使用 RecordCount 循环的属性,例如

    With rs
      .ActiveConnection = CurrentProject.Connection
      .Source = "dbrammDump"
      .CursorLocation = adUseClient  ' <<< THIS MISSING FROM ORIGINAL CODE
      .CursorType = adOpenKeyset
      .LockType = adLockBatchOptimistic
      .Open
    
      Dim counter As Long
      For counter = 0 To .RecordCount - 1
          .Delete
          .MoveNext
      Next
    
      .UpdateBatch
    
      rowsDel = counter
    
    End With
    

    fwiw我同意这里的其他人的观点,在SQL中使用基于集合的解决方案比上面那样的过程代码更好。

        2
  •  1
  •   shahkalpesh    15 年前

    你为什么要这样删除记录,当你可以打电话的时候 myconnection.Execute "DELETE FROM myTable WHERE....." ?

    另外,您是如何打开记录集的?粘贴 myrecordset.Open(...) 这里的声明。
    看看这个 link 帮助。

        3
  •  1
  •   onedaywhen    15 年前

    您的插入源是否是一个数据集,可在要作为批附加的select语句中使用?如果是这样,那就是你的答案。

    如果需要使用ADO代码删除/插入/更新的行数,请使用以下代码。

    CurrentProject.Connection.Execute strSQL, lngRecordsAffected, adCmdText