SqlCommand,传递可能为null的内容

时间:2011-11-16 20:36:58

标签: sql-server sqlcommand

我有一个SQL命令,我被要求修改,我遇到了一些问题,我传递给SQL的内容现在可以为null。如果我传递一个值,我可以依赖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时更清楚或更好的方法来处理可空参数。

3 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:0)

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

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

一般来说,虽然ReportCode为null信号,我想根据其他参数进行选择,而不关心null是什么。

有点顽皮

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

考虑到你使用的是IsNullOrEmpty,

会给你你想要的东西。

答案 2 :(得分:0)

嗯,你的解决方法是正确的

只有(@ReportCode IS NULL和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)
相关问题