2013-12-17 53 views
0

如何編寫更新語句以更新數據庫中的表,並且每個更新的字段都不相同?並使用Linq to SQL。搜索StackOverFlow和谷歌後,我發現與動態選擇語句相關的所有內容都是我不需要的。動態選擇表中的字段進行更新

一些信息,以幫助:

我有一個名爲典型域的人表:名字,姓氏,電話,地址,城市,國家等

我目前還單獨的函數執行更新到FirstName,LastName等。我想將這些組合成1個函數,可以將給定的字段更新爲給定的值,並且我使用Linq to Sql。

讓我知道這是否仍然清晰如泥。

清理每個評論的泥漿:澄清我正在使用Linq to Sql。

代碼信息:

bool UpdatePersonFirstName(string FirstName, Int PersonId) 
{ 
    bool _wasUpdated = false; 

    if (PersonId == 0) 
      throw new ArguementMissingException(); 

    using (CustomerModelDataContext proxy = new CustomerModelDataContext()) 
    { 
     try 
     { 
      var _result = proxy.Persons.SingleOrDefault(_per => _per.PersonId = PersonId) 
      _result.FirstName = FirstName; 
      proxy.SubmitChanges(); 
      _isUpdated = true; 
     } 
     catch (exception ex) 
     { 
      throw ex; 
      } 
    } 
    return _isUpdated; 
} 

bool UpdatePersonAddress(string AddressInfo, Int PersonId) 
{ 
    bool _wasUpdated = false; 

    if (PersonId == 0) 
      throw new ArguementMissingException(); 

    using (CustomerModelDataContext proxy = new CustomerModelDataContext()) 
    { 
     try 
     { 
      var _result = proxy.Persons.SingleOrDefault(_per => _per.PersonId = PersonId) 
      _result.Address = AddressInfo; 
      proxy.SubmitChanges(); 

      _isUpdated = true; 
     } 
     catch (exception ex) 
     { 
      throw ex; 
      } 
    } 
    return _isUpdated; 
} 

重複上述在人表中的每個可更新字段。

我想完成以下任務:

void UpdatePersonTable(string FieldName, string FieldValue, int PersonId) 
{ 
    ... 
    var _result = Proxy.Persons.SingleOrDefault(_per => _per.PersonId = PersonId); 
    _result.[Field matching FieldName] = FieldValue; 
    Proxy.SubmitChanges(); 
    ... } 

回顧一下,我想1點的方法,將根據傳入的字段名稱,不必進行多次更新語句值副做更新。

編輯:更新代碼以提供更多的功能方法。代理只是模型數據上下文的名稱,正如前面提到的那樣,它使用Linq to Sql連接。

+1

很清楚我們的泥,直到你在表單提交您的問題的方法一個簡明的代碼示例:) – BartoszKP

+0

你可以顯示你聲明代理的地方嗎?我在我的例子中使用了一個ObjectSet,因此語法可能會有所不同。 –

+0

在你的代碼中你聲明瞭一個'_wasUpdated',但從來沒有使用它並設置並返回一個'_isUpdated'。我也不明白爲什麼你甚至會返回'bool',因爲沒有可能返回false的代碼路徑。最後,[永遠不要拋出前;'](http://stackoverflow.com/questions/730250/is-there-a-difference-between-throw-and-throw-ex)只做'拋出;'或'拋出新的MoreSpcificExecption(「一些細節」,例如);' –

回答

1

如果你想有一個函數執行所有類型的更新,你可以創建一個接受蘭巴表達式作爲參數

public void Update(Func<T> predicate) 
{ 
    //Use 'predicate' against your data source... 
    //Can't provide more code since I don't know if you are using EF, SqlClient, etc. 
} 
+0

這應該是一個評論,而不是一個答案。 – Shiva