2017-06-16 19 views
0

我有以下的是寫在2.0框架object.ToString()時,對象爲空行爲

SqlConnection mySqlConnection = new SqlConnection("Connection String"); 
mySqlConnection.Open(); 
SqlCommand mySqlCommand = mySqlConnection.CreateCommand(); 
mySqlCommand.CommandText = "SELECT OutputType FROM Reports WHERE ReportID = 'NEWREP'"; 

return mySqlCommand.ExecuteScalar().ToString(); 

當是SQL查詢中沒有記錄,會的ExecuteScalar返回null的對象,可以能夠轉換的C#代碼通過ToString()將空對象轉換爲字符串。

沒有發生任何異常。

但是,當針對.Net 4.0的相同代碼拋出異常時,「對象引用未設置爲對象的實例」。

任我可以能夠使用

return mySqlCommand.ExecuteScalar() as string; 

return (string)mySqlCommand.ExecuteScalar(); 

來處理異常在4.0

但我想知道爲什麼沒有2.0拋出的異常?這種行爲的任何線索?

在此先感謝。

+1

ExecuteScalar將返回null對象,並且可以通過ToString()將空對象轉換爲字符串 - 這不可能,重新檢查pls 2.0解決方案,看起來它返回了一些東西 – tym32167

+1

是的,我沒有購買那也是。那將是一個突破性的改變。 –

+0

它不能在.net2.0重新檢查,這是不可能的,因爲其他人說。對於解決方案,您可以使用內聯空值檢查,例如'return mySqlCommand.ExecuteScalar()?. ToString()? 「';' – Franck

回答

1

ExecuteScalar如果找不到匹配的數據,則返回null。

object.ToString()拋出NullReferenceException如果objectnull。這與網點框架版本無關。我懷疑你的觀察與框架2.0是不正確的。

要處理空值,有多種方法。你已經說過其中兩個。

return Convert.ToString(mySqlCommand.ExecuteScalar()); 

編輯的評論:

兩個4.0碼和2.0指向具有相同的代碼相同的SQL數據庫。我只有exe文件(2.0版本),所以無法調試它返回的值。但確定沒有拋出異常

這不僅僅是關於ToString()而且這不是關於C#或.NET。請注意,該方法在object上被調用。完整的通話聲明是object.ToString()。如果objectnull,很明顯它是ToString()成員無法訪問,因此是例外。任何成員對null實例的訪問都會導致大多數不會創建隱式實例的編程語言在任何版本中出現相同的異常。

+0

4.0代碼和2.0都指向具有相同代碼的相同SQL DB。我只有exe文件(2。0版本),所以無法調試它返回的值。但確定沒有異常拋出 – Parthiban

+0

檢查我的編輯請... –