我正在用 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 事务的方法已正确完成。