将DBNull.Value和Empty文本框值传递给数据库

时间:2012-09-16 02:56:07

标签: c# .net sql-server ado.net dbnull

我的页面上有一些文本框可以为空,因为它们是可选的,我有这个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的查询也会变得混乱

请就常见做法或与此有关的事情提出建议。

3 个答案:

答案 0 :(得分:10)

首先,还有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;
}

答案 1 :(得分: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));
}

答案 2 :(得分:2)

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

create procedure XXX
(
   @FirstName nvarchar(50) = null,
   @LastName nvarchar(50) = null,
   ...
)