发生异常时自动处理SqlTransaction

时间:2016-01-08 10:52:06

标签: c# sql-server transactions

我需要在事务中执行一堆INSERT查询,并在其中一个失败时回滚所有内容,但我仍需要执行所有这些查询,以便一次性获取所有错误消息。

我有这样的事情:

using (var myConn = new SqlConnection(DbConnectionManager.Instance.CurrentConnection.ConnectionString))
{
    myConn.Open();
    using (var myTransaction = myConn.BeginTransaction())
    {
        try
        {
            foreach (var req in myReqsToExecute)
            {
                using (var myCom = new SqlCommand(req.Request, myConn, myTransaction))
                {
                    try
                    {   
                        //Set parameters
                        ...
                        myCom.ExecuteNonQuery();
                    }
                    catch (Exception ex)
                    {
                        var detail = "...";
                        errorMessages.Add("Erreur ExecuteSQL : " + ex.Message + " Details : " + detail.ToString());
                    }
                }
            }
        }
        finally
        {
            if (errorMessages.Any())                            
                myTransaction.Rollback();
            else
                myTransaction.Commit();
        }
    }
}

通常效果很好。
但是如果发生Exception并且我遇到的错误是Error converting data type nvarchar to numeric.(可能在正常过程中发生),则在catch块中,myCom.Transaction设置为{{1}似乎要处置null,因此SqlTransaction不能再被使用,并且提交的任何后续有效查询都会被提交。

看起来事务是自动回滚但有任何其他错误(至少是我尝试过的),它的行为与预期一致(即我可以手动回滚)。

0 个答案:

没有答案