以下は、私が取り組んでいる2つのストアドプロシージャへの2つの呼び出しのコードです。オールオアナッシングアトミックトランザクションを実行するようにこれを設定したと思いましたが、2番目のストアドプロシージャ呼び出しでエラーが発生した場合でも、最初の呼び出しは実行されます。私はまだC#でこれらを書くのは初めてなので、助けていただければ幸いです。どうも!
また、これが行っていることで奇妙だと思うことにも言及する必要があります。例外がスローされ、プログラムが「catch」ブロックに入った場合でも、「finally」ブロックのコードが実行されます。私の理解では、例外がスローされた場合、「catch」ブロックのコードだけが実行されます。
編集以下の応答のおかげで、catch / finalの混乱を修正し、ExecuteNonQuery()呼び出しを追加して、最初のストアドプロシージャも呼び出されるようにしました。ただし、最初のストアード・プロシージャーが呼び出されると、2番目のストアード・プロシージャーがその作業を実行する前に、最初に実行されるように呼び出される必要があります。これはアトミックトランザクションで実行できるものですか、それとも個別に実行する必要がありますか?
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);
}