繁体   English   中英

为什么IS NULL有效,但DateTime的DBNull.Value的SQL参数却不起作用?

[英]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)所说的那样,您不能直接将NULLNULL进行比较,否则它将不会返回任何内容(根据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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM