2012-08-27 48 views
-1

我正在用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 

EDIT

此卷繞是與在所述第二存儲過程中的邏輯的一個問題。以上列出的通過C#代碼創建兩個SQL事務的方法已正確完成。

+0

你的地方打開連接? Sql代碼似乎是正確的,但爲什麼你創建一個SqlCommand傳遞事務,然後再次設置事務?我想添加到參數集合的值是在其他地方定義的嗎? – Steve

+0

是的,參數是在上面的代碼中定義的(它非常大,以爲我會讓每個人都饒有興趣)。 SqlCommand對象都調用不同的存儲過程。在C#中編寫這些調用非常新,這應該以不同的方式完成嗎? – NealR

+0

不是,我說過你的代碼對我來說看起來很好。該錯誤是否存在於存儲過程中?你可以添加這些特效的代碼嗎? – Steve

回答

0

我認爲您不需要以這種方式進行交易,您可以使用TransactionScope,它也更容易使用和一次性使用。

基本上就是這個link