-1

2 つの別個のストアド プロシージャを呼び出すコードを C# で作成しています。最初の手順は常に呼び出されるとは限りませんが、呼び出された場合は、2 番目の手順を開始する前にそのタスクを完了する必要があります。何が起こっているかというと、2 つが並んで走っているように見えるということです。最初のタスクは、2 番目のタスクで識別子として使用される番号を更新することになっています。ただし、2 番目のタスクは、識別子が見つからない場合、代わりにレコードを追加するか、レコードの更新を実行します。更新された適切なレコードと挿入された新しいレコードの両方を見つけ続けるので、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 のインスタンスが見つかった場合、更新が実行されます。そうでない場合は、挿入を実行します。2 つが同時に呼び出されると、ID 番号が更新され、新しいレコードが挿入されます。すべての変数値も正しいことを確認しました。

SELECT @rows = COUNT(AgentId) 
FROM AgentIdentification
WHERE AgentId = @num

IF @rows > 0

編集

これは、2 番目のストアド プロシージャのロジックに問題がありました。C# コードを介して 2 つの SQL トランザクションを作成する上記の方法は、適切に実行されました。

4

1 に答える 1

0

そのように取引を行う必要はないと思います。 を使用でき、TransactionScope使いやすく、使い捨ても可能です。

基本的には、このリンクが参照するものです

于 2012-08-27T16:57:10.103 に答える