我正在使用ado.net来调用sproc并插入数据。 在插入之前确保没有参数为空的最佳方法是什么? 该表将允许某些列上的空值,但在这种情况下,我需要确保每个值在插入之前不为null。 我可以检查每个值为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();
}
答案 0 :(得分:3)
当然,你可以去写10-15 if-else语句。但是,如果您计划扩展解决方案并将关注点分离并避免代码重复,我建议不要这样做。 根据我的经验,我建议您使用以下库:
http://fluentvalidation.codeplex.com/
这是一个基于规则的验证引擎,非常易于使用。只需看看Codeplex上的示例。这是一个非常简单明了的框架。 基本上,您可以添加用于验证域对象的规则,并将验证规则封装到特定于实体的验证类中。它允许您在没有条件逻辑的情况下轻松添加一个“存储过程调用”,并且不会违反开放原则(您需要添加新的验证器而不是修改现有验证器)
您需要实现自己的自定义验证程序(例如,CustomerValidator类) 甚至在打开连接并开始初始化SqlCommand之前,请检查Customer对象的有效性:
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类中的验证规则编写单元测试。
答案 1 :(得分:1)
同意UI上的验证,但我也会检查数据层。
if(string.IsNullOrEmpty(dealerid))抛出新的ArgumentNullException(“dealerid”);
此Null或Empty测试。如果你想接受空,那么只测试null。
如果dealerID是一个字符串,请确保它将解析为Int。
可能想做其他东西,比如trim()。除非他们特别想要包含前导和尾随空格,否则会造成混乱的查询。
经常错过的是SQL不接受与.NET一样广泛的日期范围,因此需要测试日期范围。