1

我正在使用 ado.net 调用 sproc 并插入数据。在插入之前确保所有参数都不为空的最佳方法是什么?该表将允许在某些列上使用空值,但在这种情况下,我需要确保每个值在插入之前都不为空。我可以检查每个值是否为 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();
         }
4

2 回答 2

3

当然,您可以编写 10-15 个 if-else 语句。但是,如果您计划扩展您的解决方案并进行关注点分离并避免代码重复,我不建议您这样做。根据我的经验,我建议您使用以下库:

http://fluentvalidation.codeplex.com/

这是一个非常易于使用的基于规则的验证引擎。只需查看 Codeplex 上的示例。这是一个非常简单直接的框架。基本上,您可以添加验证域对象的规则并将验证规则封装到特定于实体的验证类中。它将允许您在没有条件逻辑的情况下轻松添加一个“存储过程调用”,并且不会违反 Open-Closed 原则(您需要添加一个新的验证器而不是修改现有的验证器)

您将需要实现自己的自定义验证器(例如,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 类中的验证规则编写单元测试。

于 2012-09-19T20:48:39.850 回答
1

Agree with validation on the UI but I would also check at the data layer.

if(string.IsNullOrEmpty(dealerid)) throw new ArgumentNullException("dealerid");

This test for Null Or Empty. If you want to accept empty then only test for null.

If dealerID is a string make sure it will parse to Int.

May want to do other stuff like trim(). Unless they specifically want to include leading and trailing spaces it makes for messy queries.

Often missed is SQL does not accept as broad a date range as .NET so need to test for date range.

于 2012-09-19T18:11:40.897 回答