On Error GoTo ErrorHandler Dim sSQL As String If DbConnection Then Cn.BeginTrans sSQL = "insert into test1(PID,UID,PS) Values(1,'1','1');" _ & "insert into test1(PID,UID,PS) Values(2,'1','1');" _ & "insert into test1(PID,UID,PS) Values(3,'1','1');" _ & "insert into test1(PID,UID,PS) Values(4,'1','1');" Cn.Execute sSQL sSQL = "insert into test1(PID,UID,PS) Values(5,'1','2');" _ & "insert into test1(PID,UID,PS) Values(6,'1','1');" _ & "insert into test5(PID,UID,PS) Values(7,'1','1');" Cn.Execute sSQL Cn.CommitTrans MsgBox "执行成功", vbInformation End If Exit Sub ErrorHandler: Cn.RollbackTrans MsgBox Err.Description, vbInformation
其中 test5 表是不存在的 但是 这个事物是会执行成功的 。
可能原因 ado其实不判断事物的 他交给后台判断 但是 后台遇到多条sql时候只会检测返回第一条的判断结果
如果
sSQL = "insert into test5(PID,UID,PS) Values(5,'1','2');" _ & "insert into test1(PID,UID,PS) Values(6,'1','1');" _ & "insert into test1(PID,UID,PS) Values(7,'1','1');"则 事物就会回进行回滚。
解决方法 。 拼接字符串 要 采用 一句一条的方法 使用
SQL = "insert into test5(PID,UID,PS) Values(5,'1','2');"这样 ado就会正确的判断出结果。SQL = "insert into test1(PID,UID,PS) Values(6,'1','1');"