2014-06-06 76 views
0

這可能看起來像一個奇怪的問題,但它現在一直在困擾着我。鑑於我不是一個經驗豐富的程序員,而且我是該公司唯一的應用程序/ c#開發人員,所以我覺得有必要與你們進行合理的檢查。c#更新單個數據庫字段或整個對象?

我們已經創建了內部處理公司內部航運信息的應用程序,這個應用程序的工作原理與我們的IT辦公室的中央數據庫。

我們最近將DB從mysql切換到mssql,並且在轉換過程中我們決定放棄以前使用的web服務並使用應用程序角色直接連接到數據庫,爲了增加安全性,我們只允許訪問存儲過程和所有CRUD操作通過這些處理。

但是,我們目前有存儲過程用於更新我們的一個對象中的每個字段,這是很多存儲過程,因此在DataRepository的客戶端上需要很多工作(需要單獨的代碼來調用過程併爲每個程序傳遞正確的參數)。

所以我想,如果只是更新整個對象(在這種情況下,一個對象代表一個表,例如發貨),因爲很多數據會一次更改一個字段在初始插入之後,並且我們試圖保持網絡使用率下降,因爲一些客戶端將使用有限的互聯網運行。

請告訴我標準的做法這樣的事情?或者有沒有我忽略的方法?

回答

-1

如果你知道你改變了什麼(如果使用一個像實體框架這樣的ORM),只更新你改變的東西會更好,但是如果你要下載存儲的proc路由,那麼肯定會更新一行中的所有東西一旦這種方式足夠精細。

你應該採取的交換機作爲oportunity到到LINQ但是如果你在一個大的變化是已在此過程中儘可能

+0

Baring mind這是一個相對較小的應用程序,實體框架看起來像是矯枉過正。你也會說「儘可能在進程中存儲過程」,爲什麼會這樣? – Ben

+0

實體框架並不過分,新技術比舊技術簡單不復雜。我建議放棄存儲過程的原因是因爲維護起來不那麼痛苦,如果你是孤獨的,你的情況更是如此,一切都在LINQ的代碼中,沒有部署與你的DBA同步,沒有你的SQL語句之外的任何SQL語句源代碼控制等等。由於我轉換到了實體框架/ linq思維模式(早在linq到sql的早期階段),我不必輸入多於幾十行的sql,並且我不會錯過它。 –

+0

我有個人做數據庫工作,因爲我遠不是TSQL專家,他處理存儲過程。我們在以前的幾個關於它增加額外安全性的問題上提出了一些建議後使用它們,因爲這些客戶端通過互聯網訪問數據庫(通過SSL) – Ben

0

我要說的是,更新所有列改爲實體和溝存儲過程整個行是一個更普遍的做法。

如果你對每個字段一個進程,而你在一個更新更改多個領域,你將必須包裝所有的存儲過程調用到一個單一的交易,以避免數據庫進入不一致的狀態。您還必須檢測哪個字段已更改(這意味着您需要將舊行與新行進行比較)。

考慮使用像實體框架的對象關係映射(ORM)對於這些類型的操作。你會發現關於ORM是否是一個很好的解決所有數據訪問需求的解決方案並沒有普遍的共識,但很難說它們很全面地解決了CRUD的問題。

+0

好吧,因爲它站着現在,更新只能用於單列,當文本框發生更改時,它只是簡單地通過和事件調用,在發送到存儲過程之前,檢測到的更改全部通過客戶端完成。我們這樣做是因爲絕大多數時間,只有一個字段會在任何時候被編輯。 – Ben

0

直接連接到數據庫在互聯網上是不是我切換到着急。

「我們決定放棄先前使用的web服務,並直接連接到數據庫」

是什麼讓你決定呢?

如果你打算在這個模型中,然後一個存儲過程來更新整個行會優於每列一個。我有一個類似的應用程序,它以這種方式使用SPROC,但客戶端的數據通過XML進入,然後服務器端的中間件應用程序處理更新數據庫。

+0

這種變化的主要原因是縮短了開發時間,Web服務原本就是作爲一種安全措施。然而,切換到mssql允許我們將存儲過程中的應用程序角色使用,這爲我們提供了足夠的安全性並減少了切換所需的開發時間 – Ben

0

標準做法是而不是通過互聯網連接到數據庫。即使是小的應用程序 ,這應該是整個模型:

客戶端應用程序 - >互聯網 - >服務器端的應用程序(WCF WebService的) - > LAN /本地主機 - > SQL DB

好處:

  • 您的客戶端應用程序甚至不知道您已切換數據庫實現。
  • 它不會知道任何關於數據庫安全等等
  • 作爲一名程序員,您在客戶端不會考慮「行」和「列」。那些將是對象和領域。
  • 您將能夠使用不同的協議:只發送客戶端應用程序和服務器應用程序之間的單個字段更新,但更新服務器應用程序和數據庫之間的整個行。

現在,根據您的情況,更新整行(整個對象)肯定比更新單列更標準。

相關問題