2009-09-07 55 views
3

即時嘗試更新SQL表中的所有記錄使用下面的代碼,但沒有數據更新。有誰知道爲什麼?對於二傳手c#linq更新數據庫中的所有記錄

 using (DataContext db = new DataContext()) 
     { 
      foreach (Item record in db.Items) 
      { 
       record.Description += "bla"; 
       db.SubmitChanges(); 
      } 
     } 

代碼:

[Column(Storage="_Description", DbType="NVarChar(400) NOT NULL", CanBeNull=false)] 
public string Description 
{ 
    get { return this._Description; } 
    set { 
     if ((this._Description != value)) 
     { 
     this._Description = value; 
     } 
     } 
} 
+0

您可能想要將標記更改爲LINQ2SQL - 這是一個LINQ2SQL問題,而不僅僅是linq。 –

+0

嘗試更新時是否收到任何消息? –

+0

沒有消息,一切看起來像是在工作。 – Grant

回答

4

出於好奇,看是否移動的SubmitChanges()循環外有差別:

 using (DataContext db = new DataContext()) 
     { 
      foreach (Item record in db.Items) 
      { 
       record.Description += "bla"; 
      } 
      db.SubmitChanges(); 
     } 
+0

感謝BFree但沒有工作。 – Grant

+0

不,不會那樣。這可能會提高效率。 – Tarik

2

也許你需要提供連接字符串。

using (DataContext db = new DataContext(_MyConnectionString)) 
{ 
    foreach (Item record in db.Items) 
    { 
     record.Description += "bla"; 
    } 
    db.SubmitChanges(); 
} 

我沒有提供連接字符串時,DataContext出現了一些奇怪的問題。

2

我會指出你可以在循環關閉後提交更改......這不會解決你的問題,但它會有所幫助。

3

從您在評論中發佈的setter的詳細信息中,您的Description屬性尚未正確創建以通知屬性更改。您是自己編寫該屬性還是由VS2008工具生成?如果你使用VS2008工具,你應該得到像下面這樣的幾個方法:你的Item類(所有Linq to Sql實體都應該實現INotifyPropertyChanging和INotifyPropertyChanged),它會給你PropertyChanging事件和PropertyChanged事件。實體類:

protected virtual void SendPropertyChanging(string propertyName) 
    { 
     if (this.PropertyChanging != null) 
     { 
      this.PropertyChanging(this, new PropertyChangingEventArgs(propertyName)); 
     } 
    } 

    protected virtual void SendPropertyChanged(string propertyName) 
    { 
     if (this.PropertyChanged != null) 
     { 
      this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 

現在你對你的財產setter方法中,你應該使用這些方法來籌集所需的事件:

[Column(Name="Description", Storage="_Description", 
        DbType="NVarChar(400) NOT NULL", CanBeNull=false)] 
public string Description 
{ 
    get { return this._Description; } 
    set 
    { 
     if ((this._Description != value)) 
     { 
      this.SendPropertyChanging("Description"); 
      this._Description = value; 
      this.SendPropertyChanged("Description"); 
     } 
    } 
} 

我也注意到你沒有名稱屬性在你的列屬性中設置,所以添加它只是爲了防萬一(我的例子中包含它,假設你的列名是「Description」)。

+0

由於實施的代碼,我看不到任何錯誤,可以防止更新,但錯誤必須在setter中。 – Tarik

+0

嗨,Simon,DBML數據完全是在VS2008中創建的。按照你的指示後,我仍然無法獲得任何數據更新和變更集返回0 ... – Grant

+0

也許有一些可笑的基本我已經忽略了像沒有主鍵或真的很簡單... – Grant