2010-03-09 56 views
2

這是確保字段具有數據庫有效值的好方法嗎?我如何驗證分類字段?

internal class Customer 
{ 

    private string _CustomerId; 
    internal string CustomerId 
    { 
     get 
     { 
      return (_CustomerId==null?string.Empty:(_CustomerId.Length>20?_CustomerId.Substring(0,20):_CustomerId)); 
     } 
     set 
     { 
      _CustomerId = value; 
     } 
    }} 

問候斯文

+0

你能提供更多關於你正在使用的細節嗎?這是什麼技術。你使用哪種數據庫技術,以及你如何與它進行交互?這是Web/Windows/WPF /類庫嗎? – 2010-03-09 12:05:27

+0

對不起 它在一個classlibray中。我正在爲一個正在同步2個數據庫的應用程序構建一個庫。我的問題是,他們允許不同長度的表中的字段。 檢查null是因爲在提供空值​​時向sql查詢添加參數時出現錯誤。 – Zwempha 2010-03-09 12:12:45

回答

3

一個清潔技術是使用驗證屬性來標註你的屬性和使用庫來驗證實體。

例子包括:

然後,根據所選擇的庫中,你的代碼將類似於:

public class Customer 
{ 
    [StringLengthValidator(20)] 
    public virtual string CustomerId { get; set;} 
} 
+1

當您的驗證很簡單時,我會使用DataAnnotations。當需求更加複雜時,請使用企業庫驗證應用程序塊。它允許許多複雜的場景。 – Steven 2010-03-09 12:23:00

+0

+1 DataAnnotations可能是Sven需要的唯一東西。與其他人一樣,當他釋放圖書館時,他不得不擔心可能存在衝突的許可證。旁註:另一個答案是張貼,而我輸入這個,並以某種方式使我的評論成爲一個答案! – 2010-03-09 12:23:32

+0

同意。我最近犯的錯誤是使用Enterprise Library Validation Block屬性裝飾WCF DataContracts,現在所有WCF服務的使用者都需要引用各種EntLib dll的特定版本。哎呀。 回想起來,我應該使用DataAnnotations。 – 2010-03-09 12:26:50

2

驗證輸入的方式非常脆弱。您正在排除任何可能的輸入(對於這種情況下的CustomerId)並在請求時對其進行清理。這可能適用於這種基本情況,但在很多情況下,您無法清理輸入。你基本上是糾正用戶的錯誤,並假設他想要的。你將如何使用郵件地址做到這一點?例如,必須將郵件地址'stevenhotmail.com'轉換爲'[email protected]'或'[email protected]'。除此之外,還有編程錯誤的可能性。你想讓你的程序嘗試修復你自己的編程錯誤。這會讓你頭痛。或者當同一實體的兩個屬性必須進行比較時,你會做什麼?

更好的解決方案是讓實體處於無效狀態並在將其保存到數據庫之前檢查其有效性。當狀態無效時,不要嘗試自動更正這些更改,而只是拋出異常或將錯誤傳回給用戶。

有多種方法可以做到這一點。例如,您可以在每個實體上實施IsValid()方法或使用驗證框架。