12

我的页面上有一些文本框可以为空,因为它们是可选的,并且我有这个 DAL 代码

parameters.Add(new SqlParameter("@FirstName", FirstName));
parameters.Add(new SqlParameter("@LastName", LastName));
parameters.Add(new SqlParameter("@DisplayName", DisplayName));
parameters.Add(new SqlParameter("@BirthDate", BirthDate));
parameters.Add(new SqlParameter("@Gender", Gender));

这些字段中的任何一个都可以为空。问题是当他们是空的我收到Procedure XXX requires @FirstName which was not supplied

然后我将代码更改为

parameters.Add(new SqlParameter("@FirstName", String.IsNullOrEmpty(FirstName) ? DBNull.Value : (object)FirstName));
parameters.Add(new SqlParameter("@LastName", String.IsNullOrEmpty(LastName) ? DBNull.Value : (object) LastName));
parameters.Add(new SqlParameter("@DisplayName", String.IsNullOrEmpty(DisplayName) ? DBNull.Value : (object) DisplayName));
parameters.Add(new SqlParameter("@BirthDate", BirthDate.HasValue ? (object)BirthDate.Value : DBNull.Value));
parameters.Add(new SqlParameter("@Gender", String.IsNullOrEmpty(Gender) ? DBNull.Value : (object) Gender));

但这对我来说看起来很乱,尤其是转换为,object因为三元语句要求两个值都是相同的类型。

为什么在数据库中不处理空字符串或空字符串NULL?如果我必须将其转换为DBNull.Value是否有更清洁的方法?将值保存为数据库中的空字符串可能会有所帮助,但NULL数据库中的查询也会变得混乱

请就常见做法或类似做法提出建议。

4

3 回答 3

13

首先,还有 2 个更方便的重载:

command.Parameters.Add("@name").Value = value;

或者

command.Parameters.AddWithValue("@name", value);

我个人使用以下扩展方法:

public static object DbNullIfNull(this object obj)
{
    return obj != null ? obj : DBNull.Value;
}

command.Parameters.AddWithValue("@name", value.DbNullIfNull());

或者

public static object DbNullIfNullOrEmpty(this string str)
{
    return !String.IsNullOrEmpty(str) ? str : (object)DBNull.Value;
}
于 2012-09-16T07:05:33.760 回答
5

一点重构可能会使代码不那么混乱。试试这个

dbParams.Add(SetDBNullIfEmpty("@FirstName", FirstName));
dbParams.Add(SetDBNullIfEmpty("@LastName", LastName));
dbParams.Add(SetDBNullIfEmpty("@DisplayName", DisplayName));
dbParams.Add(SetDBNullIfEmpty("@BirthDate", BirthDate));
dbParams.Add(SetDBNullIfEmpty("@Gender", Gender));

private SqlParameter SetDBNullIfEmpty(string parmName, string parmValue)
{
    return new SqlParameter(parmName, String.IsNullOrEmpty(parmValue) ? DBNull.Value : (object)parmValue));
}
于 2012-09-16T06:27:26.623 回答
2

您可以默认存储过程中的参数,使其成为可选参数。

create procedure XXX
(
   @FirstName nvarchar(50) = null,
   @LastName nvarchar(50) = null,
   ...
)
于 2012-09-16T04:21:37.837 回答