更新
当数据库通过标量返回值时,它将始终为object
。因此,当返回值时,您应该有一个先入为主的概念,即类型是什么。当你有ToString();
传递两个参数时,为什么要使用SELECT
。
如果它不存在,它将始终抛出null
。所以在我的重构中我相信as
将是正确的方法。由于ToString()
会引发错误 - 那么cast
的形式是什么呢?
我有一些我正在维护的代码,但在我的部分重构中,我遇到ToString()
附加到ExecuteScalar
的代码。我的问题是,ToString()
的用法是否等同于:
(string)command.ExecuteScalar();
或者它代表了这个:
command.ExecuteScalar() as string;
显然as string
会优雅地失败,cast (string)
实际上会落入InvalidCastException
。所以当你打电话时:
command.ExecuteScalar().ToString();
它试图采用casting
的哪种方法?
答案 0 :(得分:10)
不,它并不意味着其中任何一个 - 它只是意味着无论价值是什么都要调用ToString()
。
特别是,如果值不一个字符串,它仍会将其转换为字符串 - 而string
将失败,InvalidCastException
和{{1}将返回null。
例如:
as
当然,object x = 10;
string a = x.ToString(); // "10"
string b = x as string; // null
string c = (string) x; // Bang
仍然可以抛出异常 - 最明显的是,如果调用的目标是ToString()
引用。
就个人而言,如果您知道结果类型应该是什么,我建议使用强制转换 - 虽然null
的结果通常 数字值(例如计数)而不是一个字符串。
是的,这意味着如果你错了会抛出异常 - 但是如果你的查询没有按照它的意图行事,那么因异常而停止可能比继续虚假观点更好世界。 (有关这种态度的更多信息,请参阅my blog post on casting vs as
。)
答案 1 :(得分:7)
两者都没有,因为Object.ToString()
会返回对象的字符串表示形式。无论查询是返回varchar
还是int
。
答案 2 :(得分:1)
如果command.ExecuteScalar()
返回null
,那么null.ToString()
将会破坏您的生产代码。
(string)command.ExecuteScalar()
也会破坏您的代码。
我建议使用下面的行
var result = command.ExecuteScalar() as string;
if(result != null)
{
//your code
}
答案 3 :(得分:1)
让我们考虑一下。
当你执行command.ExecuteScalar()时,你会在很多情况下根据你得到int的提供者回来并反对。
操作顺序触发
会发生什么在大多数情况下,toString并不意味着抛出异常,如果没有人在链中实现,你只需返回对象类型,即对象的实现。
在int的情况下说它可能是上面的那个。请注意,如果执行标量将null返回到字符串将导致错误输出,因为null不是对象。
希望有所帮助。
P.S。如果你告诉我ExecuteScalar的对象类型,我可以给你一个更好的答案。