2009-12-01 97 views
2

我有一個小問題。請指導我。 我在C#(控制檯應用程序)編碼。我在代碼中調用了2個不同的存儲過程。基本上這兩個存儲過程都訪問同一個表。 第一個SP有一個選擇查詢和一個更新查詢。 第二個SP具有單個更新查詢。交易存儲過程C#

現在我想以事務模式調用這些SP(要麼全部成功,要麼第二個SP失敗回滾第一個SP)。我在我的C#代碼中使用了「TransactionScope」,但似乎無法正常工作。即當我停止控制檯應用程序時,有時會看到第一個SP被執行,第二個SP失敗。

有人可以建議我這個。

Regards,
賈斯汀塞繆爾。

+0

你如何在代碼中使用事務範圍(使用語句或try/catch)? – Goran 2009-12-01 12:26:00

+0

是的Goran,我使用「using」語句,如: 使用(TransactionScope scope = new TransactionScope()) 封裝在try/catch塊中。 並且對SP的調用在此範圍內 – 2009-12-01 12:36:44

+0

我不明白這是怎麼回事。如何在OnExit方法中添加回滾調用?這應確保在停止控制檯應用程序並且事務未完成時調用回滾。 – Goran 2009-12-01 12:46:11

回答

4

如果使用TransactionScope,它應該做工精細,但範圍必須環繞連接(S)

using(TransactionScope tran = new TransactionScope()) { 
    using(SqlConnection conn = new SqlConnection(cs)) { 
     // either multiple commands on one connection 
     using(SqlCommand cmd = conn.CreateCommand()) { 
     // etc 
     } 
     using(SqlCommand cmd = conn.CreateCommand()) { 
     // etc 
     } 
    } 
    using(SqlConnection conn = new SqlConnection(cs)) { 
     // or a separate connection 
     using(SqlCommand cmd = conn.CreateCommand()) { 
     // etc 
     } 
    } 
    tran.Complete(); 
} 

an edge case where a TransactionScope can fail導致後來的命令來運行沒有交易。

或者,對於單個連接使用SqlTransaction,但請記住將事務(從連接)關聯到每個命令。

+0

Marc, 我有點困惑。我一次只讀一行。做一些使用兩個SP的處理。這個單獨的行處理在TransactionScope中。如果我在每個事務中寫入SqlConnection,它將意味着每個事務中的單獨連接。 如果我錯了,請提出建議! – 2009-12-01 14:06:33

+0

對不起,我被叫走了 - 會更新。 – 2009-12-01 15:01:51

+0

最後,我不得不在每次交易中創建一個單獨的連接。 極好的馬克!!! 感謝Marc和Goran的支持。 乾杯! – 2009-12-01 15:02:29