2011-11-16 29 views
3

我有我一直要求修改SQL命令,我有一些麻烦的事实,就是我传递给SQL现在可以为空。如果我传递一个值,我可以依赖SQL中的columnName = @parameterName,但使用NULL时,我无法传递null或DBNull并使其正确解析。SqlCommand的,路过的东西,可能是空

这里的SQL伪代码:

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

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

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

但是,如果REPORTTYPE是空的,我需要使用Report_Code IS NULL在SQL,而不是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时的可空参数。

回答

2

简短的回答是没有,该API的SqlClient需要你在DbNull.Value以通为NULL参数值。

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

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

+0

的代码是不漂亮,什么要求我做的是不让它漂亮,只是添加额外的功能。在整个项目中,空值在这里被视为“没有”而不是“任何事物”,并且我保持与已有的编码惯例保持一致。我也不必担心(现在)是否是该领域的入门,但我已经评论了我的代码以指出这一点。 –

0

大同小异的,在过去,我已经建立了查询

测试reportcode为空,如果是它与“ReportCode是空”替换ReportCode = @ReportCode 添加reportcode参数,如果它不是。

但是总的来说空的ReportCode标志着我想根据其它参数来选择并不在乎零一个了。

这是一个有点调皮

但如果ISNULL(ReportCode, '')= ISNULL(@ReportCode, '')

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

0

那么,是正确的方式,你如何解决它

仅是(@ReportCode IS NULL和Report_Code IS NULL)不能是neccesary。因为它不是c#o C++。

一些应当如何最终导致

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