我有以下用2.0框架编写的c#代码
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对象,并且能够通过ToString()将null对象转换为字符串。
没有抛出异常。
但是当针对.Net 4.0的相同代码时,抛出异常“对象引用未设置为对象的实例。”
我可以使用
return mySqlCommand.ExecuteScalar() as string;
或
return (string)mySqlCommand.ExecuteScalar();
处理4.0中的异常
但我想知道为什么2.0没有抛出异常?这种行为的任何线索?
提前致谢。
答案 0 :(得分:1)
ExecuteScalar
将返回null。
object.ToString()
为NullReferenceException
, object
会抛出null
。这与dot net框架版本无关。我怀疑你对框架2.0的观察是不正确的。
要处理空值,有多种方法。你已经说过其中两个了。
return Convert.ToString(mySqlCommand.ExecuteScalar());
修改您的评论
4.0代码和2.0都指向具有相同代码的相同SQL DB。我只有exe文件(2.0版本)所以无法调试它返回的值。但肯定没有抛出异常
这不仅仅是ToString()
,这与C#或.NET无关。请注意,该方法正在object
上调用。完整的通话声明为object.ToString()
。如果object
为null
,很明显无法访问ToString()
成员,因此也是例外。 null
实例上的任何成员访问都会在大多数不创建隐式实例的编程语言的任何版本中导致相同的异常。