[英]Why does IS NULL work but SQL Parameter with DBNull.Value for DateTime does not?
我有一个C#控制台应用程序,该应用程序正在SQL Server 2014上执行数据库查找。它对带有DateTime列的表进行查询,该列名为EffectiveDate,该列允许空值。
如果我编写使用“ WHERE EffectiveDate IS NULL”的标准SQL查询,结果将正确返回。 如果我更改WHERE子句以接受参数并将该参数设置为DBNull.Value,则结果为null。
示例1使用IS NULL-> resultObj具有适当的值:
public void RetrieveFileType()
{
string sSQL = "SELECT [FileType] " +
"FROM DTCC_APP_ProcessControl " +
"WHERE [EffectiveDate] IS NULL ";
using (SqlConnection oConn = GetNewConnection())
{
using (SqlCommand cmd = new SqlCommand(sSQL, oConn))
{
object resultObj = cmd.ExecuteScalar();
}
}
}
示例2:使用DBNull.Value-> resultObj = null:
public void RetrieveFileType()
{
string sSQL = "SELECT [FileType] " +
"FROM DTCC_APP_ProcessControl " +
"WHERE [EffectiveDate] = @EffectiveDate";
using (SqlConnection oConn = GetNewConnection())
{
using (SqlCommand cmd = new SqlCommand(sSQL, oConn))
{
cmd.Parameters.AddWithValue("@EffectiveDate", DBNull.Value);
object resultObj = cmd.ExecuteScalar();
}
}
}
我也尝试过:
cmd.Parameters.Add("@EffectiveDate", SqlDbType.DateTime).Value = DBNull.Value;
和
cmd.Parameters.AddWithValue("@EffectiveDate", SqlDateTime.Null);
我唯一得到结果的是是否使用IS NULL。 这是一个简化的示例,我可以选择为@EffectiveDate设置一个值或Null。
我已经阅读了其他在线信息,似乎我需要的只是一个可为空的数据库列,并使用DBNull.Value作为参数,它应该可以工作。 我想念什么?
问题与参数化无关,但与参数可以具有NULL
值这一事实无关。 就像史蒂夫(Steve)所说的那样,您不能直接将NULL
与NULL
进行比较,否则它将不会返回任何内容(根据SQL标准,该值始终为false)。
2个工程以及当参数guarranted永远不会成为你的榜样的直接比较NULL
,示例1是好的,如果它永远是NULL
。 但是,如果根据某些外部条件有可能为NULL
或不为NULL
,我们也必须考虑将其纳入SQL查询。 这样的事情会做:
SELECT [FileType]
FROM DTCC_APP_ProcessControl
WHERE [EffectiveDate] = @EffectiveDate OR @EffectiveDate IS NULL
这可以同时处理两种情况,但是请注意,此表达式不可SARGable,并且如果存在,则将不使用EffectiveDate
列上的索引。
一种替代方法是,根据参数的最终值,客户端选择动态地在示例1或2之间进行选择,以提交一个或另一个查询。 这可能会导致更好的性能和索引使用率。
因为DB中的NULL
与c#不同。
NULL = NULL
在Sql中返回false。 您必须使用IS NULL
进行比较
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.