2016-07-27 71 views
2

我正在使用Visual Studio中的TableAdapter查询配置向导编写以下SQL查询。使用ISNULL的SQL查询

SELECT COUNT(*) AS census 
FROM Inventory INNER JOIN Taxonomy ON Inventory.GlobalID = Taxonomy.GlobalID 
WHERE (Inventory.Institution = @institution) AND (Inventory.Year = @year) AND 
    (Inventory.Nending > 0) 

我试图以下标准添加到WHERE子句:

(Taxonomy.Class = ISNULL(@class, Taxonomy.Class)) 

,使得任一
1)仅行匹配@class输入参数被退回或
2 )无论其TaxonomyGlobal.Class值如何,都将返回所有行。

当我将此语句添加到查询中时,调用查询的C#代码抛出System.ArgumentNullException错误,并声明@class值不能为空。

任何有关如何将此标准添加到WHERE子句的帮助将不胜感激。

C#代码:

namespace CollectionMetrics 
{ 
    class DatabaseQueries 
    { 
     QueryDataSetTableAdapters.InventoryTableAdapter queryAdapter = 
      new QueryDataSetTableAdapters.InventoryTableAdapter(); 

     public void CensusQuery(string institution, short year, string xclass) 
     { 
      int census = 0; 
      string localClass = xclass; 
      if (xclass == "All Classes") localClass = null; 

      census = (int)queryAdapter.CensusBySpecies(localClass, institution, year); 
      censusOutput.Add(census); 
     } 
    } 
} 
+1

ISNULL不会告诉你expressin是否为null,而只是用指定值替换空值。 –

+0

@DavidP,我认为他明白了。再次仔细查看ISNULL在这里的使用情况。 –

+0

请提供与此问题相关的完整C#代码,这将有助于我们更好地理解您 – Surendra

回答

2

SQL:

(@class IS NULL OR Taxonomy.Class = @class) 

由于您使用TableAdapter,您将需要编辑的字段为允许空值:

https://msdn.microsoft.com/en-us/library/ms233762.aspx

设置AllowDbNull属性

使查询接受空值在数据集设计器中, 选择需要接受空参数 值的TableAdapter查询。在Properties窗口中选择Para​​meters并点击省略号(...)按钮以打开Parameters Collection Editor。选择 允许空值的参数并将AllowDbNull属性 设置为true。

如果您正在使用SqlParameters

C#

var param = new SqlParameter("@class", (object) classVariable ?? DBNull.Value); 

替换classVariable与正在使用在代码中设置为@classSqlParameter值的变量的名称。因为该变量不具有与DBNull相同的类型,所以需要转换为object

+0

如果原始变量为空,您是否在我的编辑中使用了'DbNull.Value'的代码? –

+0

您将不得不将'classVariable'替换为您用于设置'@ class'参数值的任何变量。对于'DBNull',对不起,请大写'B' –

+0

查看我更新的答案。你必须在这里添加对象,然后它才能工作。 https://msdn.microsoft.com/en-us/library/ms173224.aspx –

0

我曾经试着做你想做的事情,认为这是一个很好的方式来忽略没有从前端传递的参数(因此是NULL)。

但后来我了解到,像这样的WHERE子句中使用ISNULL()防止指数被使用,使得比如果你用你的查询慢得多:

WHERE (Taxonomy.Class = @Class OR @Class IS NULL) 

直观,我承认;你尝试的方式看起来会更干净,因此速度更快,但对于SQL性能来说,最重要的是使用可用的索引,所以事实证明A OR B方法实际上比您要使用的方法更快。至于为什么你得到一个错误,它必须是向导执行的东西。如果您纯粹使用SQL(使用SSMS)尝试了您的查询,它将允许它。除非您的查询实际上是在存储过程中,并且@Class是必需的参数。