一点点字符串

本文关键字:字符串 一点点 | 更新日期: 2023-09-27 18:19:25

更新:

<小时>

当数据库通过标量返回值时,它将始终是object。因此,当返回值时,您应该对类型有一个先入为主的概念。当您有一个传递两个参数的SELECT时,为什么要使用ToString();

就好像它不存在一样,它总是抛出一个null。因此,在我的重构中,我相信as将是合适的方法。由于ToString()会抛出一个错误——那么它可以与cast的什么形式相比较呢?

<小时>

我有一些代码正在维护中,但在一次重构中,我发现了一个连接到ExecuteScalarToString()。我的问题是,ToString()的用法是否等同于:

(string)command.ExecuteScalar();

或者它会代表这个:

command.ExecuteScalar() as string;

显然,as string会优雅地失败,而cast (string)实际上会落入InvalidCastException。所以当你打电话时:

command.ExecuteScalar().ToString();

它试图采用casting的哪种方法?

一点点字符串

不,这并不意味着这两者中的任何一个——它只是意味着对任何值调用ToString()

特别是,如果值是而不是字符串,它无论如何都会将其转换为字符串,而string将因InvalidCastException而失败,as将返回null。

例如:

object x = 10;
string a = x.ToString(); // "10"
string b = x as string; // null
string c = (string) x; // Bang

当然,如果调用的目标是null引用,那么ToString()仍然可以抛出异常。

就我个人而言,如果你知道结果类型应该是什么,我建议使用强制转换——尽管ExecuteScalar的结果通常是数值(例如计数)而不是字符串。

是的,这意味着如果你错了,就会抛出一个异常——但如果你的查询无论如何都没有按照它的意图进行,那么由于异常而停止可能比用虚假的世界观进行要好。(有关这种态度的更多信息,请参阅我关于选角与as的博客文章。)

两者都不是,因为Object.ToString()将返回对象的字符串表示。不管查询返回的是varchar还是int

如果command.ExecuteScalar()返回null,那么它将类似于null.ToString(),这将破坏您的生产代码。

(string)command.ExecuteScalar()也会破坏您的代码。

我建议使用线下

var result = command.ExecuteScalar() as string;
if(result != null)
{
  //your code
}

让我们考虑一下。

当你执行command.ExecuteScaler()时,在很多情况下,你会得到基于提供程序的返回和对象

发生的是操作顺序触发

  • Command.ExecuteScaler()获取并返回对象
  • 我们假设他是一个整数,如果我们得到这个整数
  • To String被调用,它是在int32对象本身中定义的
  • 你可以取回里面确定的绳子

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

既然如此,在int的情况下,它可能就是上面的那个。注意,如果执行标量返回null,字符串将出错,因为null不是对象。

希望能有所帮助。

附言:如果你告诉我ExecuteScalar的对象类型,我可以给你一个更好的答案。