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

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

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

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

一点点重新分解可能会使代码变得更加混乱。 试试这个

 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)); } 

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

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