我在C#中编写代码,调用两个独立的存储过程。第一个过程并不总是被调用,但是当它完成时,它需要在第二个过程开始之前完成它的任务。发生了什么事情似乎是两个并排运行。第一个任务是更新在第二个任务中用作标识符的数字。但是,第二个任务是,如果找不到标识符,则会添加记录或对其执行更新。由于我一直在找到更新的相应记录和插入的新记录,我想知道是否A:我写错了或B:是否可以在事务中顺序调用和完成存储过程?
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 oldNumber = (int)(long.Parse(temp) / 777);
SqlParameter newNum = new SqlParameter("@newNum", num.Value);
SqlParameter oldNum = new SqlParameter("@oldNum", oldNumber);
sqlComm2 = new SqlCommand("DB.dbo.sp_UpdateNum", sqlConn, sqlTrans);
sqlComm2.CommandType = CommandType.StoredProcedure;
sqlComm2.Parameters.Add(newNum);
sqlComm2.Parameters.Add(oldNum);
sqlComm2.Transaction = sqlTrans;
sqlComm2.ExecuteNonQuery();
}
//Update records according to queue messages
sqlComm = new SqlCommand("DB.dbo.sp_NumCheck", 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);
}
以下是存储过程中的一些代码:
sp_UpdateNum - 调用时,需要先完成
ALTER PROCEDURE [dbo].[sp_UpdateNum]
(
@newNum char(9),
@oldNum char(9)
)
AS
UPDATE AgentIdentification
SET AgentId = @newNum
WHERE AgentId = @oldNum
sp_NumCheck - 这个代码中有很多代码,但这里是最相关的部分:这些是在这个存储过程中执行的第一行代码。它对AgentId进行检查。如果找到特定ID的实例,则它将执行更新。如果没有,它将执行插入。当两个同时被调用时发生的是ID号被更新,然后插入新记录。我已经检查过以确保所有变量值都正确。
SELECT @rows = COUNT(AgentId)
FROM AgentIdentification
WHERE AgentId = @num
IF @rows > 0
修改
这结果是第二个存储过程中的逻辑问题。上面列出的通过C#代码创建两个SQL事务的方法已正确完成。