下面的代码演示了一个可以用来驱动随后的“开放式批处理更新”操作的查询。在这种情况下,您用 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
在该批处理操作中,要注意用来改变 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 中所需要的那样。