strmsg = strmsg & "shipper = " & objrs1("companyname") & vbcrlf
strmsg = strmsg & "value = " & objrs1("phone").value & vbcrlf
strmsg = strmsg & "underlyingvalue = " & _
objrs1("phone").underlyingvalue & vbcrlf
strmsg = strmsg & "originalvalue = " & _
objrs1("phone").originalvalue & vbcrlf
strmsg = strmsg & vbcrlf & "original value has been restored."
msgbox strmsg, vbokonly, _
"conflict " & objrs1.absoluteposition & _
" of " & intconflicts
objrs1("phone").value = objrs1("phone").originalvalue
objrs1.movenext
wend
objrs1.updatebatch adaffectgroup
else
strmsg = "errors occurred during the update. " & _
objrs1.activeconnection.errors(0).number & " " & _
objrs1.activeconnection.errors(0).description
end if
on error goto 0
end if
objrs1.movefirst
objrs1.close
set objrs1 = nothing
exit sub
errhandler:
if not objrs1 is nothing then
if objrs1.state = adstateopen then objrs1.close
set objrs1 = nothing
end if
if not objrs2 is nothing then
if objrs2.state = adstateopen then objrs2.close
set objrs2 = nothing
end if
if err <> 0 then
msgbox err.source & "-->" & err.description, , "error"
end if
'end
还可以使用当前 record 的或特定 field 的 status 属性来确定已发生的冲突种类。
至此发生冲突的记录检查出来了,那么下一步就是处理失败的更新。
如何解决错误将取决于错误的性质和严重性以及应用程序的逻辑。实际中的数据库大都数是多个用户共享,典型的错误是其他人在你修改某个字段之前先修改了该字段。这种类型的错误称为“冲突”。ado 将检测这种情况并报告错误。
如果存在更新错误,将被错误处理例程捕获。通过使用 adfilterconflictingrecords 常量来筛选 recordset,可以只显示发生冲突行。
范例:
本错误解决方案将打印发生冲突的记录中的作者的名和姓(au_fname 和 au_lname)。
'begin:
objrs.filter = adfilterconflictingrecords
objrs.movefirst
do while not objrst.eof
debug.print "conflict: name = "; objrs!au_fname; " "; objrs!au_lname
objrs.movenext
loop
'end