2009-09-21 38 views
0

我從我的DAL調用更新SPROC,傳遞表中的所有(!)字段作爲參數。對於最大的表,這是總共78. 我通過所有這些參數,即使可能只是一個值更改。SPROC更新記錄:如何處理不變的值

這似乎相當inefficent給我,我想知道,怎樣做的更好。

我可以定義所有的參數爲可選的,只有通過改變的,但我的DAL不知道哪個值發生了變化,因爲我只是路過它的模型 - 對象。

我可以做餐桌上的選擇updateing之前和比較值來找出哪些改變,但是這可能是辦法不多開銷,也(?)

我有點困在這裏...我對你對此的看法很感興趣。

編輯:忘了提:我使用C#(速成版)與2008年的SQL(也快速)。 DAL我寫了「我自己」(使用this文章)。 它可能不是最新的最先進的方式(從2006年開始,「Linq之前」就這麼說,但Linq僅適用於Express的本地SQL實例),但我的主要目標是學習C#,所以我想這不是太糟糕。

+0

您使用哪種語言? – 2009-09-21 11:18:52

+0

我很好奇你將如何編寫sproc來處理變量列的修改集。你打算動態生成更新語句嗎? – 2009-09-21 12:00:49

+0

我會做這樣的事情: CREATE PROCEDURE UpdateSomething \t @something VARCHAR(50)= NULL \t AS BEGIN BEGIN TRANSACTION \t IF @something IS NOT NULL UPDATE TBLTEST SET東西= '富' COMMIT \t END 不知道如果這是不好的,這就是爲什麼我問 – 2009-09-22 09:44:51

回答

0

如果您可以更改DAL(在更改完成後,一旦圖層從新模式「重新生成」時不會丟棄更改),我會推薦傳遞一個包含正在更改值的列的結構和一個結構kontaing關鍵列和值的更新。

這可以通過使用哈希表來完成,如果模式是已知的,應該很容易操縱此次在「新」的更新功能。

如果這是一個自動DAL,這些都是一些使用DALS

0

弊端您可以實現日記變化追蹤你的模型對象。這樣,每次設置新值時,都可以通過保存屬性的先前值來跟蹤對象中的任何更改。
這個信息可以存儲在以下兩種方法之一:

  1. 由於每個對象自己的私有狀態
  2. 集中在「經理」類的一部分。

在第一種解決方案中,您可以在基類中輕鬆實現此功能,並通過繼承使其在所有模型對象中運行。

在第二個解決方案,你需要創建某種容器類,將保持基準和一個唯一的標識符,以所創建的任何模型對象,並記錄在一箇中央存儲在其狀態的所有變化。
這與許多ORM(對象關係映射)框架實現這種功能的方式類似。

0

現有的ORM支持這些場景相對較好。編寫你自己的ORM將使你沒有很多這樣的功能。我發現「object.Save()」模式導致這種行爲,但沒有理由你需要遵循該模式(雖然我本人並不是一個object.Save(),我的粉絲感覺像我在少數)。

數據層可以通過多種方式知道更改了哪些內容,並且大部分內容都由現成的ORM支持。您還可以使UI和/或業務層足夠聰明,將這些知識傳遞到數據層。我更喜歡

兩個選項:

  1. 生成/手動編碼更新 方法,只有採取一系列 參數,往往會改變。
  2. 完全在飛行中生成更新語句 。