我正在用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事務的方法已正確完成。
你的地方打開連接? Sql代碼似乎是正確的,但爲什麼你創建一個SqlCommand傳遞事務,然後再次設置事務?我想添加到參數集合的值是在其他地方定義的嗎? – Steve
是的,參數是在上面的代碼中定義的(它非常大,以爲我會讓每個人都饒有興趣)。 SqlCommand對象都調用不同的存儲過程。在C#中編寫這些調用非常新,這應該以不同的方式完成嗎? – NealR
不是,我說過你的代碼對我來說看起來很好。該錯誤是否存在於存儲過程中?你可以添加這些特效的代碼嗎? – Steve