2016-07-27 67 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是必需的參數。