繁体   English   中英

SQL事务回滚失败

[英]SQL transaction rollback failure

我有两个要插入数据的表,表“ CAM”和表“ COut”,在“ CAM”中插入数据后,它将返回一个retAutoID,该ID将作为“ COut”的必需参数之一被传递给“ COut”插入。 我在业务逻辑中实施了回滚,这样,如果“ Cout”在插入时遇到异常错误,即使成功,先前对“ CAM”的插入也会回滚。

使用下面的代码,尝试执行插入后出现此错误: “当分配给命令的连接处于挂起的本地事务中时,ExecuteNonQuery要求命令具有事务。该命令的Transaction属性尚未初始化”。

我认为该问题可能是由于:

dbCommand = GetStoredProcedureCommand(“ COut_Add”)dbCommand.Connection = dbConnection

如果完全删除“ Cout”的第二个数据插入,则不会有问题。 请指教。 谢谢。

Public Function InsertCM(ByVal objCMBLL As CMBLL, ByVal dbTrans As DbTransaction, ByVal dbConnection As DbConnection, ByVal COut As DataSet) As Boolean

  Dim dbCommand As DbCommand = Nothing
  Dim retAutoID As Int32 = Nothing
  Dim bol_Success As Boolean = False

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

    dbCommand = GetStoredProcedureCommand("CAM_Add")
    dbCommand.Connection = dbConnection
    dbCommand.Transaction = dbTrans

    With objCMBLL 
      AddInParameter(dbCommand, "@Code", DbType.String, 50, DBNull.Value)
      If Not String.IsNullOrEmpty(.CamCode) Then
        dbCommand.Parameters("@Code").Value = .CamCode
      End If
      retAutoID = CType(ExecuteScalar(dbCommand), Integer)

      dbCommand = GetStoredProcedureCommand("COut_Add")
      dbCommand.Connection = dbConnection

      For i As Integer = 0 To COut.Tables("COut").Rows.Count - 1
        dbCommand.Parameters.Clear()

        AddInParameter(dbCommand, "@Ol_Code", DbType.String, 50, DBNull.Value)$
        dbCommand.Parameters("@Ol_Code").Value = COut.Tables("CampaignOutlets").Rows(i).Item(0).ToString

        AddInParameter(dbCommand, "@Campaign_AutoID", DbType.Int32, 0, DBNull.Value)
        dbCommand.Parameters("@Campaign_AutoID").Value = retAutoID

      Next i
      ExecuteNonQuery(dbCommand)
    End With  

    bol_Success = True

  Catch ex As Exception
    Throw New DALException(ex, dbCommand, Caching.GetCustomerCodeCookie(), "InsertCampaignManagementTable")
  Finally
    If Not dbCommand Is Nothing Then
      dbCommand.Dispose()
    End If
  End Try
  Return bol_Success
End Function

好的,结果我没有为tbl“ COut”包含'dbCommand.Transaction = dbTrans'。

我在您的代码中看到:

dbCommand.Connection = dbConnection(第二次)。

您是否真的需要为命令重新分配连接? 我想你不应该。 我们应该只重新分配Command对象的sql文本。 应该是这样的:

dbCommand.text = GetStoredProcedureCommand(“ COUt”)

代替

dbCommand = GetStoredProcedureCommand(“ COut_Add”)dbCommand.Connection = dbConnection

对于i As Integer = 0到COut.Tables(“ COut”)。Rows.Count-1 dbCommand.Parameters.Clear()

我想您必须在循环之前调用dbCommand.Parameters.Clear()。

HTH。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM