我有一个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时更清楚或更好的方法来处理可空参数。
答案 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)