2012-05-04 116 views
0

我有一部分函數在其下面,它從第一個SProc中檢索一個autoID,並將它作爲參數傳遞給另一個SProc。在這裏我使用了事務回滾,假設我有一個Senario,第一個SProc成功執行了一切,但在第二個SProc中遇到了問題,第一個SProc操作是否會與第二個SProc一起回滾?一直以來,我只需要處理一個SProc事務,但這對我來說有點不同。謝謝。asp.net&SQL Server +事務回滾

Public Shared Function VoucherRedemption(ByVal dbTrans As DbTransaction _ 
             , ByVal dbConnection As DbConnection _ 
             , ByVal receiptNo As String _ 
             , ByVal voucherNo As String _ 
             , ByVal customerCode As String) As Boolean 
Dim dbCommand As DbCommand = Nothing 

Try 
      If DbConnection.State <> ConnectionState.Open Then 
       DbConnection.Open() 
      End If 

      dbCommand = GetStoredProcedureCommand("Mem_Redeem") 
      dbCommand.Connection = DbConnection 
      dbCommand.Transaction = dbTrans 

      AddInParameter(dbCommand, "@ReceiptNo", DbType.String, 50, DBNull.Value) 
      If Not String.IsNullOrEmpty(receiptNo) Then 
       dbCommand.Parameters("@ReceiptNo").Value = receiptNo 
      End If 

      AddOutParameter(dbCommand, "@OutAutoIDs", DbType.String, 4000, DBNull.Value) 

      ExecuteNonQuery(dbCommand) 

      Dim outAutoIDs As String = CType(dbCommand.Parameters("@OutAutoIDs").Value, String) 

      dbCommand = GetStoredProcedureCommand("Mem_Redeem_Log_Add") 
      dbCommand.Connection = DbConnection 
      dbCommand.Transaction = dbTrans 

      AddInParameter(dbCommand, "@VoucherNo", DbType.String, 50, DBNull.Value) 
      dbCommand.Parameters("@VoucherNo").Value = voucherNo 

      AddInParameter(dbCommand, "@RedeemTransactAutoID", DbType.String, 4000, DBNull.Value) 
      dbCommand.Parameters("@RedeemTransactAutoID").Value = outAutoIDs 

    ExecuteNonQuery(dbCommand) 

     Catch ex As Exception 
      Throw New DALException(ex, dbCommand, customerCode, "VoucherRedemption") 
     Finally 
      If Not dbCommand Is Nothing Then 
       dbCommand.Dispose() 
      End If 
      If Not dbTrans Is Nothing Then 
       dbTrans.Dispose() 
      End If 
     End Try 

回答

1

它看起來像你正在使用2 storedprocedure。 使用TransactionScope而不是DbTransaction 所以,在這裏可以爲您的代碼

Public Shared Function VoucherRedemption(ByVal dbTrans As DbTransaction _ 
             , ByVal dbConnection As DbConnection _ 
             , ByVal receiptNo As String _ 
             , ByVal voucherNo As String _ 
             , ByVal customerCode As String) As Boolean 
Dim dbCommand As DbCommand = Nothing 
Using scope As New TransactionScope() 
Try 
      If DbConnection.State <> ConnectionState.Open Then 
       DbConnection.Open() 
      End If 

      dbCommand = GetStoredProcedureCommand("Mem_Redeem") 
      dbCommand.Connection = DbConnection 

      AddInParameter(dbCommand, "@ReceiptNo", DbType.String, 50, DBNull.Value) 
      If Not String.IsNullOrEmpty(receiptNo) Then 
       dbCommand.Parameters("@ReceiptNo").Value = receiptNo 
      End If 

      AddOutParameter(dbCommand, "@OutAutoIDs", DbType.String, 4000, DBNull.Value) 

      ExecuteNonQuery(dbCommand) 

      Dim outAutoIDs As String = CType(dbCommand.Parameters("@OutAutoIDs").Value, String) 

      dbCommand = GetStoredProcedureCommand("Mem_Redeem_Log_Add") 
      dbCommand.Connection = DbConnection 

      AddInParameter(dbCommand, "@VoucherNo", DbType.String, 50, DBNull.Value) 
      dbCommand.Parameters("@VoucherNo").Value = voucherNo 

      AddInParameter(dbCommand, "@RedeemTransactAutoID", DbType.String, 4000, DBNull.Value) 
      dbCommand.Parameters("@RedeemTransactAutoID").Value = outAutoIDs 

    ExecuteNonQuery(dbCommand) 

     Catch ex As Exception 
      Throw New DALException(ex, dbCommand, customerCode, "VoucherRedemption") 
     Finally 
      If Not dbCommand Is Nothing Then 
       dbCommand.Dispose() 
      End If 
     End Try 
    scope.Complete() 
End Using