2012-02-08 107 views
0

應用程序在從數據庫中獲取數據時應該預料到意外嗎?可以說我們已經在列中存儲了一個枚舉值(int或text)。當我們從數據庫返回值時,我們將該值轉換爲枚舉類型。如果某人手動更改了數據庫中的數據並破壞了數據完整性,那麼我們的演員陣容會失敗?從數據庫提取完整性破壞的數據

另一個例子是當c#中的數據類型與數據庫中等效字段的範圍相比較小時。如果任何人手動將該值放入此值,則讓對數據庫最大值說,然後應用程序會拋出範圍異常。

我們應該如何處理這種例外情況?

編輯:由於大多數答案是相似的,我將重新說明這個問題。這意味着應用程序中有異常日誌記錄。問題是:當用戶查詢某些數據,並且數據已損壞(不是來自應用程序CRUD操作,而是來自外部)時,從數據庫到模型的數據轉換將失敗,用戶將根本沒有數據。應用程序中有這樣的狀態是否可以接受?因爲應用程序本身並不導致它?

驗證數據會導致數據讀取速度大幅下降。想象一下,如果超出範圍,你需要檢查每個十進制值嗎?

+1

你應該通過塗抹和羽化做這些的人來處理這個問題。 Cat-O-Nine是廣泛接受的替代品,可以避免焦油對環境的影響。 – 2012-02-08 13:46:06

+0

:)如果我只知道... – Goran 2012-02-08 15:21:39

回答

0

我始終認爲將數據庫交互代碼放置在數據層的try...catch塊中是一種標準做法,以便您可以以文明的方式處理此類情況。

我不檢查每個可能性,但是從長遠來看支持您的代碼時能夠記錄異常將證明是有用的。

在現場系統的情況下,尤其是當您可以指責客戶擺弄他們不應該擁有的東西時總是很好。

編輯

就像我說的,你無法檢查每一個可能發生的,但可以引起諸如鑄造一個值,不存在一個枚舉的情況下捕獲異常。

實際上不可能檢查超出範圍的值,而不是極端的例如一個字段意外地返回爲DBNull或未能從數據庫數據類型轉換爲模型數據類型。在這種情況下,處理錯誤並向用戶顯示錯誤消息或「VALUE UNKNOWN」類型指示器應該沒問題。

這裏的問題是您有一個用戶在不使用您的應用程序的情況下更改數據。

您可能已經在您的數據模型中實施IDataErrorInfo,專門用於驗證用戶輸入,如果沒有看here作爲示例,或者可能是類似的。

但是,你不能真正應對'損壞'的數據是一個有效的值,即如果你的枚舉字段被更改爲一個是正確的值明智但邏輯上不正確,你不會知道,直到你來使用它,它錯了。

您必須採取務實的方法,正如您所說的那樣,從數據庫中檢索數千甚至數百個值的驗證會對性能產生不可估量的影響。

但在我看來,說「有錯誤,請聯繫您的系統管理員」或類似的東西是完全可以接受的。

+0

請檢查我的問題,我已更新它。 – Goran 2012-02-08 15:19:35

0

這取決於,通常是可能發生的嗎?

以我爲例,我做的是對的事情:

  1. 登錄一切可執行沒有(也可以是有用的這種情況下,以確定它failled)
  2. 當一個批處理文件運行它,檢查退出狀態,如果它不是0(發生錯誤),給我發一封電子郵件!

有了這個,我知道是否有事發生,我可以證明這不是我的錯。


關於您的更新,我可以說這取決於!

就我而言,我建立了關於提供的功能數據的項目。在所有項目中,我們都有一套客戶需要制定的要求(其中一個可能是來自某個表格的數據)。

客戶接受要求和voilá!所以,如果有什麼改變,這不是我們的錯,我們因爲客戶接受要求而得到保障。

+0

通常不會。請檢查我的問題,我已更新它。 – Goran 2012-02-08 15:16:48

+0

@Goran檢查我現在說的話。 – 2012-02-08 15:24:29

+0

如果我很好地理解你,你正在接受外部數據源,我正在談論我們的應用程序數據庫?我不確定你對這件事情有什麼要求?示例:C#中的十進制字段的精度爲29,SQL Server Decimal的精度爲38.如果某人在您的數據庫中輸入了一個具有38精度的值,則應用程序將異常中斷。您可以與客戶就此問題和類似問題達成什麼樣的協議?當然,這是假定在客戶網站上的數據庫。 – Goran 2012-02-08 16:09:41

0

既然你有可疑的人類在你的數據庫處於低級別,那麼你應該執行這樣的檢查。原因是調試非常昂貴,所以當其中一個錯誤發生時(因爲它不可避免地會發生),作爲一種防禦措施,您應該儘早捕獲這些錯誤,而不是讓它們傳播到您的程序中並導致更微妙的,其他地方難以發現錯誤。

如果奇怪的值進入數據庫「可能不可能」,有人可能會說這樣的檢查是不必要的。例如,你可以在你的數據庫列上放置一個列約束。即使在這種情況下,也可以將代碼檢查作爲一種防禦措施,除非您可以爭辯說這些檢查會降低系統的性能(他們可能不會)。

+0

檢查數據完整性可能會產生不利影響。請檢查我的問題,我已更新它。 – Goran 2012-02-08 15:17:20