簡體   English   中英

為什么 SqlParameter 名稱/值構造函數將 0 視為空?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM