2012-09-19 31 views
1

我正在使用ado.net調用存儲過程並插入數據。 什麼是確保在我插入之前沒有任何參數爲空的最佳方法? 該表將允許某些列上的空值,但在這種情況下,我需要確保每個值在插入之前都不爲空。 我可以檢查每個值爲null,並在爲其分配SqlParameter之前拋出一個nullargument異常。只是不確定這是否是最好的方式。插入前驗證數據的最佳方法

感謝

這裏是參考

using (var con = new SqlConnection(ConnectionString.GetWebTablesConnectionString())) 
     using (var cmd = new SqlCommand("InsertNewCustomer", con)) 
     { 
      cmd.CommandType = CommandType.StoredProcedure; 
      cmd.Parameters.Add("dealerid", SqlDbType.Int).Value = dealerid; 
      cmd.Parameters.Add("firstname", SqlDbType.NVarChar, 50).Value = customerToInsert.FirstName; 
      cmd.Parameters.Add("lastname", SqlDbType.NVarChar, 50).Value = customerToInsert.LastName; 
      cmd.Parameters.Add("mailingaddress", SqlDbType.NVarChar, 50).Value = customerToInsert.MailingAddress.Addr; 
      cmd.Parameters.Add("mailingcity", SqlDbType.NVarChar, 30).Value = customerToInsert.MailingAddress.City; 
      cmd.Parameters.Add("mailingstate", SqlDbType.NVarChar, 25).Value = customerToInsert.MailingAddress.State; 
      cmd.Parameters.Add("mailingzip", SqlDbType.NVarChar, 10).Value = customerToInsert.MailingAddress.Zip; 
      cmd.Parameters.Add("mailingcountry", SqlDbType.NVarChar, 2).Value = customerToInsert.MailingAddress.Country; 
      cmd.Parameters.Add("homephone", SqlDbType.NVarChar, 20).Value = customerToInsert.HPhone; 
      cmd.Parameters.Add("email", SqlDbType.NVarChar, 75).Value = customerToInsert.Email; 
      cmd.Parameters.Add("referredBy", SqlDbType.NVarChar, 50).Value = customerToInsert.ReferredBy; 

      con.Open(); 
      cmd.ExecuteNonQuery(); 
     } 
+3

開展您的驗證的Web窗體將它傳遞到數據訪問層之前... – 2012-09-19 17:59:21

+0

@邁克爾我並不總是有控制的形式驗證的能力,因爲它往往是由另一家開發商或完成球隊。我需要以某種方式捕捉它,如果有什麼不應該插入之前留空。這種方法只是我需要做的許多事情之一。這只是最簡單的發佈。有些來自各種來源的數據要複雜得多,我需要確保它們在插入之前不會忘記任何數據。希望有道理。謝謝! – twaldron

回答

3

當然,你可以去寫10-15 if-else語句。但是,我不建議這樣做,如果你打算擴展您的解決方案,並有顧慮到位分離以及避免代碼重複。 根據我的經驗,我會建議您使用以下庫:

http://fluentvalidation.codeplex.com/

這是一個基於規則的驗證引擎,這是非常容易使用。只要看看Codeplex上的例子。這是一個非常簡單和直接的框架。 基本上,你可以添加規則來驗證你的域對象和封裝驗證規則到實體特有驗證類。它將允許您輕鬆地添加一個「存儲過程調用」而無需使用條件邏輯,並且它不會違反開放 - 關閉原則(您將需要添加一個新的驗證器而不是修改現有的驗證器)

您會需要實現自己的自定義驗證器(例如的CustomerValidator類) 檢查客戶對象的有效性你打開連接之前就開始初始化的SqlCommand:

CustomerValidator validator = new CustomerValidator(); 
ValidationResult results = validator.Validate(customerToInsert); 
if(results.IsValid){ 
    using (var con = new SqlConnection(ConnectionString.GetWebTablesConnectionString())) 
     using (var cmd = new SqlCommand("InsertNewCustomer", con)) 
     { 
      //Do the actual insert/SP call here, your object is valid 
     } 
    } 
} 

而且,你現在就可以編寫單元測試爲您的驗證規則封裝到CustomerValidator類中。

+0

我喜歡這個。這是完美的,我希望找到的。我知道在插入之前每次需要驗證時,都必須比寫一個TON if語句更好。 – twaldron

+1

男子我失去了複選標記,但這是一個更好的答案。 +1 – Paparazzi

1

了一下我的代碼同意在UI驗證,但我還要檢查在數據層。

if(string.IsNullOrEmpty(dealerid))throw new ArgumentNullException(「dealerid」);

此測試爲空或空。如果你想接受空,那麼只測試null。

如果dealerID是一個字符串,請確保它將解析爲Int。

可能想做其他的東西像trim()。除非他們特別想要包含前後空格,否則會造成混亂的查詢。

經常錯過的是,SQL不接受與.NET一樣廣泛的日期範圍,因此需要測試日期範圍。

+0

好的,這就是我打算做的只是不確定是否有更好或更乾淨的方式來做到這一點。謝謝 – twaldron

相關問題