2010-06-03 118 views
0

我需要幫助完成參數化查詢。幫助C#參數化SQL查詢,並設置空值

SELECT * 
FROM greatTable 
WHERE field1 = @field1 
AND field2 = @field2 

用戶應該能夠搜索任何2個字段,用戶也應該能夠搜索field2是否有空值。

var query = "theQuery"; 
var cm = new SqlCommand(cn, query); 

cm.AddParameter("@field1", "352515"); 
cm.AddParameter("@field2", DBNull.Value); 

// my DataTable here is having 0 records 
var dt = GetTable(cm); 

[編輯]

什麼是最好的選擇嗎?

  1. 保持的CommandText恆定,從而在SQL計劃被重用

    WHERE(FIELD2 = @ FIELD2 OR @ FIELD2 IS NULL)

  2. 變化的CommandText動態基於由用戶引入的值。

    WHERE場2 IS NULL

我不只是想在一個領域,它可能是不同的。

回答

0

一個骯髒的方法: ISNULL(field2,0)= ISNULL(@ param2,0)

有isnull的東西,絕不會在現場或PARAM

+1

@ field2 IS NULL允許返回所有結果......所以你可能想要小心這個結果。在null上搜索是非常棘手的。 – Zielyn 2010-06-03 22:22:22

3

您可以使用AND (@field2 IS NULL OR field2 = @field2)使該查詢返回所有行而不檢查field2(允許你從你的代碼通過的DBNull 完整的查詢會是這樣的:使用這種實現方法具時

SELECT * 
FROM greatTable 
WHERE field1 = @field1 
AND (@field2 IS NULL OR field2 = @field2) 

注d由於編制索引可能會導致性能下降。有關詳細信息,請參閱this article

+0

最好不僅僅是將WHERE field2 IS NULL直接放在CommandText中? – 2010-06-03 22:10:47

0

一個很好的問題,但在實踐中我沒有時間這樣的問題。如果我使用AddParameter,那麼我也在相同的代碼片段中構造查詢字符串。所以,如果我知道,我現在應該尋找「@域2」等於NULL我決定是否建造

string query = "SELECT * " + 
    "FROM greatTable " + 
    "WHERE field1 = @field1"; 

string query = "SELECT * " + 
    "FROM greatTable " + 
    "WHERE field1 = @field1 AND field2 IS NULL"; 

,並添加只有一個參數

cm.AddParameter("@field1", "352515"); 

所以我沒時間描述你描述的問題。

更新:什麼是最好的(或唯一正確的)方式是用戶輸入爲NULL,你應該根據上下文來決定。在大多數情況下,「AND field2 IS NULL」不是必需的,但我讀了你的問題,以便在特殊情況下用戶可以明確地選擇「」(空字符串),但是是NULL值。

+0

實際上,它是一個日期值,有時爲空,但與問題無關,但我得出結論:更好地構造查詢並將IS NULL條件直接放在那裏 – 2010-06-04 12:08:00