2013-11-22 30 views
0

回滾我在下面的代碼下面插入語句故意引發SqlExceptionModifiedBSQL事務並不在vb.net

+1

像你實際使用它看起來並不交易。你開始的時候,但是當你調用你的非查詢函數時,我不會看到命令被添加到事務中的位置,而不是僅僅被執行,這就解釋了爲什麼回滾沒有撤銷任何東西。 – helrich

+0

您的意思是說,事務和非查詢命令使用相同的連接?每個非Query方法在本地變量中打開連接,然後在單獨的類中執行該命令之後立即關閉它們。你可以發佈一些代碼,以確切地突出你在評論中提出的建議......謝謝.... – User1

回答

2

更換正確的列名ModifiedBy你需要用整個SQL代碼在一個事務。就拿這個例子:

create table errTest 
(
intVal int 
) 

insert into errTest select 1 
insert into errTest select 1/0 
select * from errTest --one record 

第二個插入失敗,但因爲沒有交易被明確啓動,每個刀片本身就是它自己的事務。第一個成功,第二個失敗,表最終保留成功的插入。

如果所有刀片被包裝在一個事務,如果xact_abort上,然後通過任何插入拋出的任何錯誤都將導致整個事務回滾:

create table errTest 
(
intVal int 
) 

set xact_abort on 
begin transaction 
    insert into errTest select 1 
    insert into errTest select 1/0 
commit transaction 
select * from errTest --zero records 
0

您需要您的交易和連接傳遞給你想在一個SQL事務中使用所有的命令,這是我的例子(我剪一些東西出來使用記事本,因此可能會給工作室的錯誤)

Private Sub main() 
    Using sql_conn 
    sql_conn.Open() 
    Dim SQL_transaction_INPUT As SqlClient.SqlTransaction = sql_conn.BeginTransaction 

    Try 
     Dim isOK as Boolean = False 
     isOK = update_BSE(myID, sql_conn, SQL_transaction_INPUT) 

     If isOK Then 
      SQL_transaction_INPUT.Commit() 
      sql_conn.Close() 
     Else 
      SQL_transaction_INPUT.Rollback() 
      sql_conn.Close() 
     End If 

    Catch ex As Exception 

     SQL_transaction_INPUT.Rollback() 
     If sql_conn.State = ConnectionState.Open Then sql_conn.Close() 

    End Try 
    End Using 
End Sub 

Private Function update_BSE(ByVal _IDmod As Integer, _ 
     ByVal conn_with_trans As SqlConnection, _ 
     ByVal conn_transaction As SqlTransaction) As Boolean 

    Dim ins As String = "UPDATE something WHERE IDrec = @IDmod" 
    Dim cmdINS As New SqlCommand(ins, conn_with_trans, conn_transaction) 

    Try 

     With cmdINS.Parameters 
      .Add("IDmod", SqlDbType.Int).Value = _IDmod 
     End With 
     cmdINS.ExecuteNonQuery() 

     Return True 

    Catch ex As Exception 
     Return False 
    End Try 
End Function