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');"
SQL = "insert into test1(PID,UID,PS) Values(6,'1','1');"這樣 ado就會正確的判斷出結果。