ExecuteScalar,ExecuteReader和ExecuteNonQuery有什么区别?


Answers:


190
  • ExecuteScalar通常在查询返回单个值时使用。如果返回更多,则结果为第一行的第一列。例如SELECT @@IDENTITY AS 'Identity'
  • ExecuteReader用于具有多个行/列(例如SELECT col1, col2 from sometable)的任何结果集。
  • ExecuteNonQuery 通常用于没有结果的SQL语句(例如UPDATE,INSERT等)。

39
ExecuteNonQuery可以返回受影响的行数。
Sangram Nandkhile

我认为当需要调用将返回表集合的存储过程时,将使用ExecuteNonQuery。
Gogutz 2014年

如果存储过程中有return语句,则ExecuteNonQuery也可以使用。stackoverflow.com/questions/6210027/…–
FrenkyB

40

ExecuteNonQuery():

  1. 仅适用于操作查询(创建,更改,删除,插入,更新,删除)。
  2. 返回由查询影响的行数。
  3. 返回类型为int
  4. 返回值是可选的,可以分配给整数变量。

ExecuteReader():

  1. 将与操作和非操作查询一起使用(选择)
  2. 返回查询选择的行的集合。
  3. 返回类型为DataReader。
  4. 返回值是强制性的,应将其分配给另一个对象DataReader。

ExecuteScalar():

  1. 将与包含聚合函数的非操作查询一起使用。
  2. 返回查询结果的第一行和第一列的值。
  3. 返回类型是对象。
  4. 返回值是强制性的,应将其分配给所需类型的变量。

参考网址:

http://nareshkamuni.blogspot.in/2012/05/what-is-difference-between.html


38

每个都是不同的类型执行。

  • ExecuteScalar将成为将返回单个值的查询类型。

    一个示例是在插入后返回生成的ID。

    INSERT INTO my_profile (Address) VALUES ('123 Fake St.'); SELECT CAST(scope_identity() AS int)

  • ExecuteReader为您提供了数据读取器,使您一次可以读取结果的所有列。

    一个示例是为一个或多个用户提取配置文件信息。

    SELECT * FROM my_profile WHERE id = '123456'

  • ExecuteNonQuery是任何不返回值但实际上正在执行某种形式的工作(如插入删除或修改内容)的SQL。

    一个示例是更新数据库中的用户个人资料。

    UPDATE my_profile SET Address = '123 Fake St.' WHERE id = '123456'


1
看来您可以使用ExecuteReader来完成ExecuteScalar和ExecuteNonQuery所完成的工作,那么为什么还要使用其他两个?任何性能上的好处?
2013年

避免过度使用ExecuteReader的原因之一是它将使该阅读器一直存在,直到您完成它。通过所有这些,您想了解一些有关它们如何工作的特定信息,以便最有效地使用它们。我在这里概述的是一些很好的准则。
布伦丹·恩里克

9

从文档中(注意:当您想知道做什么时,MSDN是一个方便的资源!):

执行标量

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

ExecuteReader

将CommandText发送到Connection并构建一个SqlDataReader。

...以及从SqlDataReader ...

提供一种从SQL Server数据库读取仅行数据流的方法。这个类不能被继承。

ExecuteNonQuery

您可以使用ExecuteNonQuery执行目录操作(例如,查询数据库的结构或创建数据库对象,例如表),或通过执行UPDATE,INSERT或DELETE语句来更改数据库中的数据而不使用DataSet。


8

要添加到其他人发布的内容中:

ExecuteScalar从概念上返回查询结果集第一行中最左边的列;您可以对SELECT * FROM人员执行ExecuteScalar,但是您只会得到结果行的第一个单元格,通常用于返回单个值的查询。我对SQLServer不确定100%,但是在Oracle中,您不会使用它来运行FUNCTION(返回单个值的数据库代码),并且即使函数返回单个值,也希望它为您提供函数的返回值。但是,如果您将函数作为查询的一部分运行,例如SELECT SUBSTR('abc',1,1)FROM DUAL,则它将基于返回值存储在最左上角的事实给出返回值结果行集的单元格

ExecuteNonQuery将用于运行数据库存储过程,函数和查询,以修改数据(INSERT / UPDATE / DELETE)或修改数据库结构(CREATE TABLE ...)。通常,调用的返回值指示该操作影响了多少行,但请查阅数据库文档以确保有此操作。


4

ExecuteReader() 执行一个SQL查询,该查询返回数据提供者DBDataReader对象,该对象仅提供对查询结果的正向访问和只读访问。

ExecuteScalar()ExecuteReader()专为单例查询(例如获取记录数)设计的方法类似。

ExecuteNonQuery() 执行与create,delete,update,insert一起使用的非查询)


3

ExecuteNonQuery

此ExecuteNonQuery方法将仅用于插入,更新和删除,创建和SET语句。ExecuteNonQuery方法将返回受INSERT,DELETE或UPDATE操作影响的行数。

执行标量

从数据库中检索单个值非常快。在使用命令对象执行SQL查询或存储过程时,Execute Scalar将返回单行单列值,即单值。 ExecuteReader

使用命令对象执行SQL查询或存储过程时,将使用Execute Reader返回行集。这是仅对记录的前向检索,用于从头到尾读取表值。


3

ExecuteNonQuery方法将返回受INSERT,DELETE或UPDATE操作影响的行数。此ExecuteNonQuery方法将仅用于插入,更新和删除,创建和SET语句。(阅读更多)

ExecuteScalar将在使用命令对象执行SQL查询或存储过程时返回单行单列值,即单值。从数据库中检索单个值非常快。(阅读更多)

使用命令对象执行SQL查询或存储过程时,将使用ExecuteReader返回行集。这是仅对记录的前向检索,用于从头到尾读取表值。(阅读更多)


1

ExecuteNonQuery: 通常在Sql语句未返回任何内容(如插入,更新,删除操作)时使用。

cmd.ExcecuteNonQuery();

ExecuteScalar:

当Sql查询返回单个值时将使用它。

Int b = cmd.ExcecuteScalar();

ExecuteReader

当Sql查询或存储过程返回多个行/列时将使用它

SqlDataReader dr = cmd.ExecuteReader();

有关更多信息,请单击此处http://www.dotnetqueries.com/Article/148/-difference-between-executescalar-executereader-executenonquery

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.