C# TransactionScope未捕获异常

C# TransactionScope未捕获异常,c#,C#,我已经查看了几个线程,似乎没有任何线程起到帮助作用,因此这是我的TransActionScope代码 public void InsertFormData() { try { using (TransactionScope ts = new TransactionScope()) { using (SqlConnection cnn = new SqlConnection

我已经查看了几个线程,似乎没有任何线程起到帮助作用,因此这是我的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中触发了我的应用程序_错误。基本上,我只想让它运行这些方法,如果一个方法没有正确完成,它会将其回滚。

当您以当前的方式处理异常时,执行流允许运行您的
ts.complete()
调用。要么:

  • 移除
    InsertData
    中的
    catch
  • 记录后再次抛出
    InsertData
    中的
    catch
    ,或
  • 使
    InsertData
    返回一个布尔值以指示成功或失败,并使调用方法仅在成功时调用
    ts.Complete()

不要调用“trans=cnn.BeginTransaction();”和“cmd.Transaction=trans”。SqlConnection应该已经调用了En登记事务。谢谢,您确实是对的。我终于让它工作了:)这个。但从一个稍微不同的角度总结一下,如果您设计了一个函数,使得调用方无法判断调用是成功还是失败,那么调用方就无法判断调用是成功还是失败,即使您确实想这样做。一厢情愿是行不通的如果失败,我会尝试返回bool determine false,但从TransactionScope上阅读的内容来看,无论出于什么原因,听起来都不需要返回bool determine false。所以基本上我只需要在方法返回true之前运行这些方法?最后,如果成功是错误的,那么就处理事务范围?@Dylan:对。当
using
语句结束时,如果尚未调用
.Complete()
,事务将自动回滚。