private void DoSomethingWithDatabase(string f1, int f2)
{
SqlCommand myCommand = new SqlCommand("SELECT Field1,Field2,Field3 FROM MyTable WHERE Field1 = @F1 AND Field2 = @F2", this.myConn);
myCommand.Parameters.Add("@F1", System.Data.SqlDbType.VarChar);
myCommand.Parameters.Add("@F2", System.Data.SqlDbType.Int);
if (f1 == "")
myCommand.Parameters["@F1"].Value = DBNull.Value;
else
myCommand.Parameters["@F1"].Value = f1;
if (f2 < 0)
myCommand.Parameters["@F2"].Value = DBNull.Value;
else
myCommand.Parameters["@F2"].Value = f2;
// code to do stuff with the results here
}
的服務器是Microsoft SQL Server實例。
數據庫表MyTable
包含可爲空的字段。因此,null是執行查詢時搜索的有效值。
從我的閱讀中,也從類似這樣的測試代碼中,執行像我在這裏所做的一樣工作不正常,因爲顯然你不能這樣做一個「等於null」的比較 - 你應該這樣做「一片空白」。
看起來您可以通過將ANSI_NULL設置爲OFF(根據https://msdn.microsoft.com/en-us/library/ms188048.aspx)來更正此問題並使其工作,但它也表示此方法已被棄用且不應使用。
該文章建議您可以使用OR運算符來執行類似WHERE Field1 = 25 OR Field1 IS NULL
的操作。問題是,通過一次調用這個函數,我想檢查或者是 null並且只有null,或者對於給定的常量值,沒有別的。
到目前爲止,似乎我需要基本上逐個字符串地構建查詢,以解釋NULL值的可能性。所以我需要做這樣的事情:
string theQuery = "SELECT Field1,Field2,Field3 FROM MyTable WHERE ";
if (f1 == "")
theQuery += "Field1 IS NULL ";
else
theQuery += "Field1 = @F1 ";
// ...
SqlCommand myCommand = new SqlCommand(theQuery, this.myConn);
if (f1 == "")
{
myCommand.Parameters.Add("@F1", System.Data.SqlDbType.VarChar);
myCommand.Parameters["@F1"].Value = f1;
}
// ...
這是真的需要怎麼做?有沒有更有效的方法來做到這一點,而不重複if
塊,並通過使用參數,而不是連接在一起查詢字符串?這個例子中的空字符串被轉換爲NULL,在實際使用的場景中,空字符串不會被使用,而是存儲NULL,數據庫不在我的控制之下,所以我不能只是說「把所有的NULL改爲空字符串」。對於整數也是一樣 - 如果我們將-1
傳遞給函數,它應該測試一個空值。壞習慣?也許,但數據庫本身不在我的控制之下,只有訪問它的代碼是)。
請謹慎對待WHERE子句中的ISNULL或COALESCE。您可能希望創建一個索引以加快查詢速度(類似Field1,Field2 INCLUDE Field3),ISNULL/COALESCE將停止正在使用的索引。你在最終代碼塊中的建議看起來很好,我認爲比任何給定的答案都好。 –