2009-09-14 62 views
1

有沒有人知道如何在LINQ to SQL提交對數據上下文的更改後再查找受影響的行數?如何查找LINQ to SQL中受影響的行數?

起初,我在做這樣的事情:

Using db as New MyDataContext() 
    db.Users.Attach(modifiedUser, True) 
    db.SubmitChanges() 

    Dim rowsUpdated As Integer = db.GetChangeSet().Updates.Count 
End Using 

因爲我已經想通了,這也不行那

db.GetChangeSet().Updates.Count 

只告訴你有多少更新會有BEFORE你調用SubmitChanges()。

無論如何找出有多少行實際上受到影響?

回答

4

L2S針對受影響的每一行發出單獨的插入/更新/刪除語句,因此在GetChangeSet結果中計數實體會爲您提供正確的'rows affected'數字*。

如果由於更改衝突或類似原因無法更新任何行,則會在提交更改期間收到異常,並且事務將回滾。

(* = ...有一個例外;如果您有可替換觸發器的可更新視圖,那麼可能會出現這樣的情況,即對於更新的每一行,替代觸發器都會觸發多個基礎行。是不是有點邊緣的情況下... :))

0

我還沒有從事LINQ to SQL。但是,我認爲這可能是不可能的。

想到的原因是:您可以在致電SubmitChanges之前更新多個實體。所以,我猜,你所尋找的「記錄受影響」的東西不會被人知道。

0

由於可能會犯下許多不同的操作,因此您很難找回這種信息。

SubmitChanges()命令將提交插入,更新和刪除,並且據我所知,無法檢索每個受影響的行數(#行刪除/更新/插入等)。就像你已經發現的那樣,你所能做的就是看看會發生什麼。

如果您有特別要執行的操作,您可以使用ExecuteCommand()方法返回受影響的行數。

0

添加這種擴展方法來應用:

/// <summary> 
    /// Saves all chanches made in this context to the underlying database. 
    /// </summary> 
    /// <returns></returns> 
    /// <exception cref="System.InvalidOperationException"> 
    /// </exception> 
    public static int SaveChanges(this System.Data.Linq.DataContext context) 
    { 
     try 
     { 
      int count1 = context.GetChangeSet().Inserts.Count + context.GetChangeSet().Updates.Count + context.GetChangeSet().Deletes.Count; 
      context.SubmitChanges(); 
      int count2 = context.GetChangeSet().Inserts.Count + context.GetChangeSet().Updates.Count + context.GetChangeSet().Deletes.Count; 
      return count1 - count2; 
     } 
     catch (Exception e) 
     { 
      throw new InvalidOperationException(e.Message); 
     } 
    }