一点点的字符串演员

时间:2014-08-26 17:24:56

标签: c# sql

更新


当数据库通过标量返回值时,它将始终为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的哪种方法?

4 个答案:

答案 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的提供者回来并反对。

操作顺序触发

会发生什么
  • Command.ExecuteScalar()获取并反对对象。
  • 我们假设他是我们得到的运动的int。
  • 调用String,它在int32对象本身中定义。
  • 你找回了里面确定的字符串。

在大多数情况下,toString并不意味着抛出异常,如果没有人在链中实现,你只需返回对象类型,即对象的实现。

在int的情况下说它可能是上面的那个。请注意,如果执行标量将null返回到字符串将导致错误输出,因为null不是对象。

希望有所帮助。

P.S。如果你告诉我ExecuteScalar的对象类型,我可以给你一个更好的答案。