我需要在事务中执行一堆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
不能再被使用,并且提交的任何后续有效查询都会被提交。
看起来事务是自动回滚但有任何其他错误(至少是我尝试过的),它的行为与预期一致(即我可以手动回滚)。