2010-08-13 91 views
2

我正在使用LINQ To SQL並調用存儲過程來插入新行。LINQ To SQL中的交易

  1. 下面的代碼是否顯示了一組適當的步驟?
  2. 我只想插入(其他四)如果所有四個插入通過否則回滾所有四個插入。
public bool InsertNewInquiry(Inquiry inq) 
{ 
    using (var transaction = new TransactionScope()) 
    { 
     using (DataContextDataContext dc = conn.GetContext()) 
     { 
      foreach (Officer po in inq.Recipients) 
      { 
       int results1 = (int)dc.**spOffice_Insert**(po.Id,po.Name).ReturnValue; 
      } 
      foreach (Lookups tags in inq.Tags) 
      { 
       int results2 = (int)dc.**spTags_Insert**(po.Id,po.Name).ReturnValue; 
      } 

      foreach (Phone phone in inq.Phone) 
      { 
       int results3 = (int)dc.**spPhone_Insert**(po.Id,po.Name).ReturnValue; 
      } 

      int results4 = (int)dc.spInquiry_Insert(
          inq.Id 
          ,inq.StatusId 
          ,inq.PriorityId 
          ,inq.Subject).ReturnValue;     


      if (results1 != 0 && results2 != 0 && results3 != 0 && results4 != 0) 
      { 
       transaction.Complete(); 
       return true; 
      } 
      return false; 

      /* old code: 
      transaction.Complete();  
      if (results == 0) 
       return false; 
      else 
       return true; */ 
     } 
    } 
} 

我已經嘗試了上面的代碼,但它不插入插入的foreach(結果:1 ......結果3)

任何想法,根據需要,我可以如何使這項工作?

回答

1

考慮一個解決方案,其中:

  • 改變你的結果的範圍
  • 如果0結果是一個條件您的任何3的foreach的,你絕對要回滾的,不如下所示增加。只需檢查0break以外的內容。
int res1=0, res2=0, res3=0, res4=0; 
foreach (Officer po in inq.Recipients) 
{ 
    res1 += (int)dc.**spOffice_Insert**(po.Id,po.Name).ReturnValue; 
} 
foreach (Lookups tags in inq.Tags) 
{ 
    res2 += (int)dc.**spTags_Insert**(po.Id,po.Name).ReturnValue; 
} 
foreach (Phone phone in inq.Phone) 
{ 
    res3 += (int)dc.**spPhone_Insert**(po.Id,po.Name).ReturnValue; 
} 
res4 += (int)dc.spInquiry_Insert(inq.Id,inq.StatusId,inq.PriorityId,inq.Subject) 
       .ReturnValue;     

//no results are zero 
if (res1 != 0 && res2 != 0 && res3 != 0 && res4 != 0) 
{ 
    transaction.Complete(); 
    return true; 
} 
return false; 
+0

這看起來是正確的,但我不知道他們是否想回滾,如果任何*的ReturnValue'數字是0. – 2010-08-17 18:39:35

+0

我認爲如果任何結果回來0你會想要回滾。 – Kelsey 2010-08-18 00:12:48

0

檢查this post其中的TransactionScope和LinqToSQL一起

0

TransactionScope採用的是在我看來要走的路。前段時間,我曾將a similar question視爲Linq To SQL中的事務。雖然這不是同一個問題,但我收到的回覆應該會爲您提供一些有用的信息。

根據我可以從您的代碼中得知您在撥打transaction.Complete();之前未計入四次返回結果。 Complete()聲明會提交您的事務,因此您希望在調用之前確保一切正確,類似於在SQL中使用COMMIT的方式。

+0

更新我的問題,請看看它。 – 2010-08-17 14:04:55

+1

@Nisar Khan你應該用實際的代碼更新你的代碼,因爲只是你添加的部分,我不知道它是如何工作的,因爲'result1','result2'和'result3'的值將超出範圍它們是在foreach中創建的,並且只會與最後一個記錄的返回結果進行比較。除此之外,代碼看起來應該是提交。您是否嘗試過運行SQL事件探查器來查看語句是否正在執行? – Kelsey 2010-08-17 17:00:36