2010-02-25 41 views
2

我有以下代碼:如何將「全選」值添加到C#和MS SQL中的參數化查詢

正如你所看到的,我需要傳遞一個參數字段2,但我還需要一個參數是ablo來處理「」所有值「選項,例如,如果我將」foo「分配給參數,查詢將返回每個記錄Field2 =」foo「...但我也希望能夠通過通配符,或有事要告訴你的是參數給所有的值作爲結果。

MyDataset dataset = new MyDataset(); 
SqlConnection objConnection = new SqlConnection(_connectionstring); 
SqlDataAdapter objDataAdapter = new SqlDataAdapter(); 
objDataAdapter.SelectCommand = new SqlCommand(); 
objDataAdapter.SelectCommand.Connection = objConnection; 
objDataAdapter.SelectCommand.CommandText = 
"SELECT Field1, Field2, Field3 FROM Table WHERE (Field2 = @Field2)"; 
objDataAdapter.SelectCommand.CommandType = CommandType.Text; 
objDataAdapter.SelectCommand.Parameters.AddWithValue("@Field2", txtBoxField2.Text); 
objDataAdapter.Fill(dataset.Table); 
this.DataContext = dataset.Table.DefaultView; 

預先感謝您。

回答

1

如果您在C#代碼中構建SQL,那麼只需在您的C#邏輯中放入一個if條件,以便在要返回所有記錄的實例中不包含WHERE子句。這將創建一個不同的SQL語句,因此可以按計劃執行性能/執行。

如果你打算使用一個存儲過程,你可以試試這個方法:

IF (@Field2 = 'SomeWildcardValue') 
    SELECT Field1, Field2, Field3 FROM SomeTable 
ELSE 
    SELECT Field1, Field2, Field3 FROM SomeTable WHERE Field2 = @Field2 

甚至,讓他們完全獨立,創建一個存儲過程,以全部迴歸,以及一個返回基於字段2搜索。雖然如果你有更多的參數,這個很快就會上升!

+0

是的,你看我有大量的參數...我發佈的代碼只是一個例子。 我正在尋找一個工作原理來不建立大量的if代碼。 – 2010-02-25 10:17:50

3

一種方式做,這是使用空的參數的:

SELECT Field1, Field2, Field3 
FROM Table 
WHERE (@Field2 IS NULL OR Field2 = @Field2) 

,但你必須知道,這可能會導致在某些情況下,那裏有許多參數不正確緩存的查詢計劃。如果您使用的是SQL Server 2005+,則可以使用OPTIMIZE FOR將其緩解爲較大的內存。

此外,請確保您的統計數據是最新的。

+0

感謝您的鏈接,實際上測試它在真實的代碼(我有很多參數)導致性能問題。 – 2010-02-25 10:19:47

+0

@Enrico Castellani:確保您的統計數據是最新的。 – 2010-02-25 10:45:58

0

通常我會在SP中使用可空參數方法。根據你的代碼,爲什麼不根據用戶輸入的內容構建SQL命令文本?例如,如果用戶在文本框中輸入了某些內容,則只需在SQL中添加一個where子句,否則只是簡單的選擇。