ExecuteScalar()是否比ExecuteReader()有任何优势?

ExecuteScalar()是否比ExecuteReader()有任何优势?

ExecuteScalar仅返回数据集第一行的第一个值。 内部它被处理就像ExecuteReader() ,打开DataReader ,选择值,然后DataReader被销毁。 我也总是想知道这种行为,但它有一个优点:它发生在框架内…而且你不能以速度的方式与框架竞争。

编辑rwwilden:看看SqlCommand.ExecuteScalar()里面的Reflector你可以看到这些行:

 SqlDataReader ds = this.RunExecuteReader( CommandBehavior.Default, RunBehavior.ReturnImmediately, true, "ExecuteScalar"); obj2 = this.CompleteExecuteScalar(ds, false); 

究竟是在ExecuteReader发生了什么。 另一个优点是ExecuteScalar在没有读取数据时返回null 。 如果您使用ExecuteReader ,则必须自己检查。

来自SqlCommand.ExecuteScalar方法

使用ExecuteScalar方法从数据库中检索单个值(例如,聚合值)。 这比使用ExecuteReader方法需要的代码少,然后使用SqlDataReader返回的数据执行生成单个值所需的操作。

另外, ExecuteReader,ExecuteNonQuery和ExecuteScalar之间有什么区别

  • ExecuteReader :用于访问数据。 它提供仅向前,只读,连接的记录集。
  • ExecuteNonQuery :用于数据操作,例如Insert,Update,Delete。
  • ExecuteScalar :用于检索1行1列。 value。,即单值。 例如:用于恢复聚合function。 它比从DB中获取单个值的其他方式更快。

从MSDN上的ExecuteScalar页面:

Use the ExecuteScalar method to retrieve a single value (for example, an aggregate value) from a database. This requires less code than using the ExecuteReader method, and then performing the operations that you need to generate the single value using the data returned by a SqlDataReader

因此,它不是更快或更好,但用于减少只需要一个值时编写的代码量。

当您从Query或SP返回单个值时,最好使用ExecuteScalar(),因为它会检索结果的第一个值。 因此,在这种情况下这会更快。

执行Scalar旨在从Execute Reader中获取数据库中的单个值,以便将多条记录导入DataTable。

与ExecuteReader()相比,ExecuteScalar()将占用更少的资源,因为稍后将从数据库返回多列数据。

ExecuteReader()将实例化基于流的SqlDataReader并查询数据源的结果