【问题标题】:SqlCommand, passing something that could be nullSqlCommand,传递可能为空的东西
【发布时间】:2011-11-16 20:36:58
【问题描述】:

我有一个被要求修改的 SQL 命令,但我遇到了一些麻烦,因为我传递给 SQL 的内容现在可以为空。如果我要传递一个值,我可以依赖 SQL 中的 columnName = @parameterName,但是对于 NULL,我无法传递 null 或 DBNull 并使其正确解析。

这是 SQL 伪代码:

SELECT
  Columns
FROM
  ClientSetup
WHERE
  Client_Code = @ClientCode AND
  Package_Code = @PackageCode AND
  Report_Code = @ReportCode

问题是现在@ReportCode 可以有效地为NULL。在我设置 SqlCommand 的 C# 代码中,我可以输入:

cmd.Parameters.Add("@ReportCode", SqlDBType.VarChar, 5).Value = reportType;
  //reportType is a string, which can be null

但是,如果 reportType 为 null,我需要在 SQL 中使用 Report_Code IS NULL,而不是 Report_Code = @reportCode。

我找到的解决方案是将最后一个 where 子句更改为以下内容:

((@ReportCode IS NULL AND Report_Code IS NULL) OR Report_Code = @ReportCode)

和参数短语到

cmd.Parameters.Add("@ReportCode", SqlDBType.VarChar, 5).Value = string.IsNullOrEmpty(reportType) ? System.DBNull : reportType;

这有什么作用,但我想知道是否有人知道在从 .NET 代码向 SQL 传递内容时,是否有更简洁或更好的方法来处理可空参数。

【问题讨论】:

    标签: sql-server sqlcommand


    【解决方案1】:

    简短的回答是不,SqlClient API 要求您为 NULL 参数值传入 DbNull.Value

    但我对您如何处理 NULL 有一些疑问。对于一个您使用string.IsNullOrEmpty 的人,这意味着您将 emtpy 字符串视为 NULL。这是有问题的,数据库中可能存在合法的空字符串值。

    我的第二个问题是在数据库中匹配 NULL 的逻辑。通常不传入 NULL 参数意味着请求对 any 值感兴趣,而不是对 NULL 值感兴趣。我并不是说您将 NULL 参数与 NULL 值匹配的逻辑有缺陷,我只是想确保您知道自己在做什么。

    【讨论】:

    • 代码不漂亮,我被要求做的不是让它漂亮,只是添加一个附加功能。在整个项目中,这里的 Null 被视为“Nothing”而不是“Anything”,并且我与现有的(不可否认的非最佳)编码约定保持一致。我也不必(现在)担心“”是该字段中的条目,但我已经注释了我的代码以指出这一点。
    【解决方案2】:

    很多,过去我已经建立了查询

    如果将 ReportCode = @ReportCode 替换为“ReportCode 为 Null”,则为 null 测试报告代码 如果不是,请添加 reportcode 参数。

    虽然 ReportCode 的 null 表示我想根据其他参数进行选择,但通常并不关心 null 是什么。

    有点小气

    但是 IsNull(ReportCode,'') = IsNull(@ReportCode,'')

    会给你你想要的,因为你正在使用 IsNullOrEmpty。

    【讨论】:

      【解决方案3】:

      嗯,你修复它的方式是正确的

      只有 (@ReportCode IS NULL AND Report_Code IS NULL) 不是必需的。因为它不是 c# o c++。

      最终结果应该是怎样的

       SELECT
         Columns
       FROM
         ClientSetup
       WHERE
         Client_Code = @ClientCode
         AND Package_Code = @PackageCode
         AND (Report_Code = @ReportCode or @ReportCode is null)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-09-26
        • 2019-05-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多