我的页面上有一些文本框可以为空,因为它们是可选的,我有这个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
的查询也会变得混乱
请就常见做法或与此有关的事情提出建议。
答案 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,
...
)