2009-07-15 49 views
4

假設我有一個用於查找項目的搜索屏幕。屏幕上有各種可選的搜索選項,這些選項會導致SQL查詢語句發生變化。有沒有辦法創建一個接受<= N參數的參數化查詢或存儲過程?

下面是一些例子搜索:

  1. 說明搜索
  2. 說明搜索+項目的供應商ID
  3. 說明搜索+項目的供應商ID +項目層級1號
  4. 說明搜索+項目供應商id +物品層次結構級別1 id +級別2 id
  5. 物品層次結構級別1 id +級別2 id(沒有說明,沒有物料供應商ID)

......你明白了。有很多可能的組合。我希望能夠使用參數化查詢來獲得性能優勢等(另外,我將它們用於整個程序中的其餘查詢)。

有沒有辦法做到這一點,或者我不得不創建每個可能的查詢並匹配SQLiteCommand對象或基於選擇的選項動態地使用StringBuilder構建查詢字符串?

我正在使用C#3.0(在3.5緊湊框架上)使用SQLite.NET數據提供程序。


更新基於一些與該參數的空默認值,並使用(@param isnull or column = @param)建議

,我想我應該能得到這個工作。我會及時向大家發佈。

注意:我避免使用存儲過程,因爲其餘代碼使用參數化查詢而不是存儲過程。我想保持一切爲了未來維護程序員的健康。無論如何,它不應該有太大的區別。


更新2

這是一個桌面系統上的工作(這是我做了我的查詢初始測試)。但是,它在我使用的Windows CE設備上非常慢。不可思議的緩慢。所有相同的,我可以肯定將來使用它,它非常方便。僅在移動設備上運行查詢時才適用。

謝謝

+0

我會告訴你如何動態地建立你的查詢,但然後參數注入警察會在我之後。 – 2009-07-15 18:50:05

+0

問題的標題是可變數量的參數。但似乎你需要一個具有N個參數但可以接受N或 shahkalpesh 2009-07-15 18:53:36

+0

@Robert我知道如何動態構建它們,這將避免許多查詢情況......但我不想這樣做的原因之一是因爲SQL注入=) – 2009-07-15 18:56:33

回答

4

從存儲過程方面你可以默認值爲null然後建立你的where子句以適應這個空值。

ALTER Procedure FooProcedure 
    @SupplierID INT = NULL, 
    @LevelOne INT = NULL 
AS 
BEGIN 

    SELECT SupplierID, LevelOne 
     FROM FooTable 
    WHERE @SupplierID IS NULL OR SupplierID = @SupplierID 
     AND @LevelOne IS NULL OR LevelOne = @LevelOne 

END 
0

您可能最好爲每個案例創建存儲過程。

如果你的C#中有一個StringBuilder構建的內聯SQL代碼,那麼執行計劃將永遠不會被緩存,而且它的性能不如存儲過程那麼好。

1

您可以在存儲過程中指定參數的默認值和處理邏輯:

create procedure mySproc(@description nvarchar(20) = null, @supplierid int = null, etc...) 

處理的參數是否在存儲過程的主體空的邏輯。

相關問題