运行开放式批处理查询

RDO

下面的代码演示了一个可以用来驱动随后的“开放式批处理更新”操作的查询。在这种情况下,您用 ClientBatch 游标库取一个结果集,并为所取的每行保存书签。当用户选择了某个网格(行显示在此处)中的一行时,代码提示用户输入一个新值,并将之写到结果集中。不过,所做的更改并不对数据进行,直到您执行了 BatchUpdate 方法。

Private Sub BatchOpsButton_Click()
   Dim rs As rdoResultset
   sql = "Select * from Authors where year_born is null"
   rdoEnvironment.CursorDriver = rdUseClientBatch
   cnB.QueryTimeout = 45
   Set rs = cnB.OpenResultset(sql, rdOpenStatic, rdConcurBatch)
   rs.MoveLast: rs.MoveFirst
   ReDim bms(rs.RowCount + 1) As Variant
   Do Until rs.EOF
      bms(i) = rs.Bookmark
      i = i + 1
      rs.MoveNext
   Loop
   rs.MoveFirst
   rdoGrid1.ShowData rs
End Sub

基于用户输入执行更新操作

下面的代码演示了如何收集用户输入(在这里,是作者年龄),然后用该信息在批处理更新操作中对数据库进行更新:

Private Sub rdoGrid1_Click()
   Dim rs As rdoResultset
   Dim NewValue As Integer
   NewValue = InputBox("Enter new age -- 1900 to 1997", "Author Age", _
    "1960")
   rs.Bookmark = bms(rdoGrid1.Row)
   rs.Edit
   rs!Year_Born = NewValue
   rs.Update
   Changes = Changes + 1
   i = MsgBox("Commit all " & Changes & " changes?", vbYesNoCancel)
   Select Case i
      Case vbYes
         rs.UpdateBatch
         Changes = 0
      Case vbNo
         Exit Sub
      Case vbCancel
         Changes = 0
         i = MsgBox("Cancel just this change (Yes) or all " & Changes & _
          " made so far (No)?", vbYesNo)
         If i = vbYes Then
            rs.CancelBatch (True)
         Else
            rs.CancelBatch
         End If
   End Select
End Sub

ADO

在该批处理操作中,要注意用来改变 R/W 结果集中选定行的例程并不需要以一个“编辑”过程开始。要达到和前面的 RDO 示例相同的效果,只需要简单地改变某个字段的内容,并使用 Update 方法来对数据库进行修改。

Private Sub BatchOpsButton_Click()
   sql = "Select * from Authors where year_born is null"
   rs.Open sql, cnB, adOpenStatic, adLockBatchOptimistic
   rs.MoveLast: rs.MoveFirst
   ReDim bms(rs.RecordCount + 1) As Variant
   Do Until rs.EOF
      bms(i) = rs.Bookmark
      i = i + 1
      rs.MoveNext
   Loop
   rs.MoveFirst
   ADOGrid1.ShowData rs
   rs.Close
End Sub

Private Sub ADOGrid1_Click()
   Dim NewValue As Integer
   NewValue = InputBox("Enter new age -- 1900 to 1997", "Author Age", _
    "1960")
   rs.Bookmark = bms(ADOGrid1.Row)
   rs!Year_Born = NewValue
   rs.Update
   Changes = Changes + 1
   i = MsgBox("Commit all " & Changes & " changes?", vbYesNoCancel)
   Select Case i
      Case vbYes
         rs.BatchUpdate
         Changes = 0
      Case vbNo
         Exit Sub
      Case vbCancel
         Changes = 0
         i = MsgBox("Cancel just this change (Yes) or all " & Changes & _
          " made so far (No)?", vbYesNo)
         If i = vbYes Then
            rs.CancelBatch (True)
         Else
            rs.CancelBatch
         End If
   End Select
End Sub

注意 在 ADO2 中,您可以用一个批处理过滤器来找到和更新有冲突的行,而不用遍历有冲突行的数组,如同在 RDO2 中所需要的那样。