无法使事务正常运行

时间:2012-08-27 16:02:12

标签: c# sql

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

1 个答案:

答案 0 :(得分:0)

我认为您不需要以这种方式进行交易,您可以使用TransactionScope,它也更容易使用和Disposable。

基本上是link指的是