[英]Why does the SqlParameter name/value constructor treat 0 as null?
我在一段代碼中觀察到一個奇怪的問題,即即席 SQL 查詢沒有產生預期的輸出,即使其參數與數據源中的記錄匹配。 我決定在即時窗口中輸入以下測試表達式:
new SqlParameter("Test", 0).Value
這給出了null
的結果,這讓我摸不着頭腦。 似乎SqlParameter
構造函數將零視為空值。 以下代碼產生正確的結果:
SqlParameter testParam = new SqlParameter();
testParam.ParameterName = "Test";
testParam.Value = 0;
// subsequent inspection shows that the Value property is still 0
誰能解釋這種行為? 不知是不是故意的? 如果是這樣,那可能是相當危險的......
如該構造函數的文檔中所述:
當您在 value 參數中指定一個 Object 時,SqlDbType 是從 Object 的 Microsoft .NET Framework 類型推斷出來的。
使用SqlParameter構造函數的此重載指定整數參數值時要小心。 由於這種重載采用類型的值對象,則必須將整數值轉換為對象的類型,如果值是零,如下面的C#示例演示。
Parameter = new SqlParameter("@pname", (object)0);
如果不執行此轉換,編譯器會假定您正在嘗試調用SqlParameter (string, SqlDbType)構造函數重載。
您只是調用了與您的情況不同的構造函數。
這樣做的原因是,C#允許從整數字面的隱式轉換0
到枚舉類型(這只是整數類型的下面),並且這隱式轉換導致(string, SqlDbType)
構造成為過載的分辨率比更好的匹配為(string, object)
構造函數將int
轉換為object
所需的裝箱轉換。
當您傳遞int
變量時,這永遠不會成為問題,即使該變量的值為0
(因為它不是零文字),或任何其他具有int
類型的表達式。 如果您如上所示將int
顯式轉換為object
,也不會發生這種情況,因為只有一個匹配的重載。
在傳遞/添加參數時使用類型化數據是一種很好的做法。
您可以通過以下方式完成以下任務:
對於字符串/varchar 類型的數據:
SqlParameter pVarchar = new SqlParameter
{
ParameterName = "Test",
SqlDbType = System.Data.SqlDbType.VarChar,
Value = string.Empty,
};
對於 int 類型數據:
SqlParameter pInt = new SqlParameter
{
ParameterName = "Test",
SqlDbType = System.Data.SqlDbType.Int,
Value = 0,
};
您可以根據您使用的數據更改SqlDbType
的值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.