下面是对我正在处理的两个存储过程的两次调用的代码。我以为我已经设置为执行全部或全部原子事务,但是如果在第二个存储过程调用中出现错误,第一个仍然会执行。我仍然是用 C# 编写这些的新手,所以任何帮助将不胜感激。谢谢!
我还应该提到其他我觉得奇怪的事情:如果抛出异常并且程序进入“catch”块,它仍然会运行“finally”块中的代码。我的理解是,如果抛出异常,“catch”块中的代码将被执行。
编辑感谢下面的回复,我已经修复了 catch/finally 混淆并添加了一个 ExecuteNonQuery() 调用,因此也调用了第一个存储过程。但是,第一个存储过程在被调用时,需要先被调用并执行,然后第二个存储过程才能完成它的工作。这是可以在原子事务中完成的,还是必须单独运行?
try
{
cm = Dts.Connections["serverName"];
sqlConn = (SqlConnection)cm.AcquireConnection(Dts.Transaction);
sqlTrans = sqlConn.BeginTransaction("QueueUpdates");
if (dummyIndicator.Equals("Y"))
{
string temp = retrievedMessage.Substring(203, 17);
int newNumber = (int)(long.Parse(temp) / 777);
SqlParameter newNum = new SqlParameter("@newNum", num.Value);
SqlParameter oldNum = new SqlParameter("@oldNum", newNumber);
sqlComm = new SqlCommand("DB.dbo.sp_UpdateNumber", sqlConn, sqlTrans);
sqlComm.CommandType = CommandType.StoredProcedure;
sqlComm.Parameters.Add(newNum);
sqlComm.Parameters.Add(oldNum);
sqlComm.Transaction = sqlTrans;
sqlComm.ExecuteNonQuery();
}
//Update records according to queue messages
sqlComm = new SqlCommand("DB.dbo.sp_AgentIdAprCheck", sqlConn, sqlTrans);
sqlComm.CommandType = CommandType.StoredProcedure;
sqlComm.Parameters.Add(num);
sqlComm.Parameters.Add(addOrUpdate);
sqlComm.Parameters.Add(companyCode);
sqlComm.Parameters.Add(agentID);
sqlComm.Parameters.Add(firstName);
sqlComm.Parameters.Add(lastName);
sqlComm.Parameters.Add(suffix);
sqlComm.Parameters.Add(taxIdType);
sqlComm.Parameters.Add(entityType);
sqlComm.Parameters.Add(corporateName);
sqlComm.Parameters.Add(outNewNumber);
sqlComm.Parameters.Add(outCurrentNumber);
sqlComm.Parameters.Add(outOperator);
sqlComm.Parameters.Add(outDate);
sqlComm.Parameters.Add(returnVal);
sqlComm.ExecuteNonQuery();
sqlTrans.Commit();
if (addOrUpd.Equals("ADD")){recordsAdded++;}
else{recordsUpdated++;}
}
catch (Exception ex)
{
_sqlDataErrors++;
swLog.WriteLine("Message not updated: " + retrievedMessage);
swLog.WriteLine("Error: " + ex.ToString());
sqlTrans.Rollback();
}
finally
{
cm.ReleaseConnection(sqlConn);
}