VB+ADO检测数据库并发操作和处理并解决并发冲突[2]

[入库:2005年8月18日] [更新:2007年3月24日]

本文简介:选择自 chenyu5188 的 blog

                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

本文关键:VB+ADO 数据库并发操作
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top