我看了几个线程,似乎没有任何帮助,所以这里是我的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。基本上我只是想让它运行方法,如果方法没有正确完成它会回滚。
答案 0 :(得分:2)
当您以您正在进行的方式吃掉异常时,执行流程允许您ts.Complete()
调用运行。之一:
catch
中的InsertData
,catch
中的InsertData
投掷,或InsertData
返回一个布尔值来表示成功或失败,并且调用方法仅在成功时调用ts.Complete()
。