TransactionScope不捕获异常

时间:2015-06-12 19:41:51

标签: c#

我看了几个线程,似乎没有任何帮助,所以这里是我的TransActionScope代码

   public void InsertFormData()
    {
        try
        {
            using (TransactionScope ts = new TransactionScope())
            {
                using (SqlConnection cnn = new SqlConnection(strConnectionString))
                {
                    cnn.Open();

                    InsertData(cnn);
                    InsertMoreInfo(cnn);
                    //etc...
                    ts.Complete();
                }
            }

        }
        catch (Exception ex)
        {
            LogException(ex);
        }

以下是我在那里调用的方法之一的示例:

public void InsertData(cnn)
    {

        SqlCommand cmd = null;
        SqlTransaction trans = null;

        try
        {

            cmd = new SqlCommand("StoredProcedure", cnn, trans);
            trans = cnn.BeginTransaction();
            cmd.Parameters.Add("@PARAM1", SqlDbType.Int);
            cmd.Parameters["@PARAM1"].Direction = ParameterDirection.Output;
            cmd.Parameters.Add("@PARAM2", SqlDbType.VarChar).Value = RepID;
            cmd.Parameters.Add("@PARAM3", SqlDbType.VarChar).Value = ViolatorID;

            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Transaction = trans;
            cmd.ExecuteNonQuery();
        }
        catch (Exception ex)
        {
           LogException(ex)
        }
    }

我用几种不同的方式重复了这种方法,结果基本相同。我已经尝试从方法中取出Try / catch来查看是否会触发错误,但它只是在Global.ascx中触发了我的Application_Error。基本上我只是想让它运行方法,如果方法没有正确完成它会回滚。

1 个答案:

答案 0 :(得分:2)

当您以您正在进行的方式吃掉异常时,执行流程允许您ts.Complete()调用运行。之一:

  • 删除catch中的InsertData
  • 在记录后再次使catch中的InsertData投掷,或
  • make InsertData返回一个布尔值来表示成功或失败,并且调用方法仅在成功时调用ts.Complete()