¿Cuál es la diferencia entre ExecuteScalar, ExecuteReader y ExecuteNonQuery?

106

¿Cuáles son los diferentes casos cuando usamos estos tres? ¿Dónde debo usar uno y dónde no?

néctar
fuente
1
Encontré este gran artículo en el mismo: webblogsforyou.com/…
immayankmodi

Respuestas:

190
  • ExecuteScalarse utiliza normalmente cuando su consulta devuelve un solo valor. Si devuelve más, el resultado es la primera columna de la primera fila. Un ejemplo podría ser SELECT @@IDENTITY AS 'Identity'.
  • ExecuteReaderse utiliza para cualquier conjunto de resultados con varias filas / columnas (por ejemplo, SELECT col1, col2 from sometable).
  • ExecuteNonQuery se utiliza normalmente para sentencias SQL sin resultados (por ejemplo, ACTUALIZAR, INSERTAR, etc.)
Mark Wilkins
fuente
39
ExecuteNonQuerypuede devolver el número de filas afectadas.
Sangram Nandkhile
Pensé que ExecuteNonQuery se usa cuando necesitas llamar a procedimientos almacenados que devolverán una colección de tablas.
Gogutz
ExecuteNonQuery también funciona si tiene una declaración de devolución en el procedimiento almacenado. stackoverflow.com/questions/6210027/…
FrenkyB
40

ExecuteNonQuery ():

  1. funcionará solo con consultas de acción (crear, modificar, soltar, insertar, actualizar, eliminar).
  2. Devuelve el recuento de filas efectuadas por la consulta.
  3. El tipo de retorno es int
  4. El valor de retorno es opcional y se puede asignar a una variable entera.

ExecuteReader ():

  1. funcionará con consultas de acción y no acción (seleccionar)
  2. Devuelve la colección de filas seleccionadas por la consulta.
  3. El tipo de retorno es DataReader.
  4. El valor de retorno es obligatorio y debe asignarse a otro DataReader de objeto.

ExecuteScalar ():

  1. funcionará con consultas sin acción que contienen funciones agregadas.
  2. Devuelve el valor de la primera fila y la primera columna del resultado de la consulta.
  3. El tipo de retorno es objeto.
  4. El valor de retorno es obligatorio y debe asignarse a una variable del tipo requerido.

URL de referencia:

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

umarali1981
fuente
38

Cada uno es un tipo de ejecución diferente.

  • ExecuteScalar será el tipo de consulta que devolverá un valor único.

    Un ejemplo sería devolver una identificación generada después de insertar.

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

  • ExecuteReader le devuelve un lector de datos que le permitirá leer todas las columnas de los resultados una fila a la vez.

    Un ejemplo sería extraer información de perfil para uno o más usuarios.

    SELECT * FROM my_profile WHERE id = '123456'

  • ExecuteNonQuery es cualquier SQL que no devuelve valores, pero en realidad está realizando algún tipo de trabajo como insertar, borrar o modificar algo.

    Un ejemplo sería actualizar el perfil de un usuario en la base de datos.

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

Brendan Enrick
fuente
1
Parece que puede usar ExecuteReader para hacer los trabajos realizados por ExecuteScalar y ExecuteNonQuery, entonces, ¿por qué usar los otros dos? algún beneficio de rendimiento?
user20358
Una razón para evitar el uso excesivo de ExecuteReader es que mantendrá al lector cerca hasta que haya terminado con él. Con todos estos, desea conocer información específica sobre cómo funcionan para poder utilizarlos de la manera más eficaz. Lo que he descrito aquí son algunas buenas pautas.
Brendan Enrick
9

De los documentos (nota: MSDN es un recurso útil cuando quieres saber qué hacen las cosas):

Ejecutar Escalar

Utilice el método ExecuteScalar para recuperar un valor único (por ejemplo, un valor agregado) de una base de datos. Esto requiere menos código que usar el método ExecuteReader y luego realizar las operaciones que necesita para generar el valor único usando los datos devueltos por un SqlDataReader.

ExecuteReader

Envía CommandText a Connection y crea un SqlDataReader.

... y de SqlDataReader ...

Proporciona una forma de leer un flujo de filas solo hacia adelante desde una base de datos de SQL Server. Esta clase no puede heredarse.

ExecuteNonQuery

Puede usar ExecuteNonQuery para realizar operaciones de catálogo (por ejemplo, consultar la estructura de una base de datos o crear objetos de base de datos como tablas), o para cambiar los datos en una base de datos sin usar un DataSet ejecutando declaraciones UPDATE, INSERT o DELETE.

Greg Beech
fuente
8

Para agregar a lo que otros publicaron:

ExecuteScalar devuelve conceptualmente la columna más a la izquierda de la primera fila del conjunto de resultados de la consulta; podría ExecuteScalar un SELECT * FROM staff, pero solo obtendría la primera celda de las filas resultantes Normalmente se usa para consultas que devuelven un solo valor. No estoy 100% seguro de SQLServer, pero en Oracle, no lo haría usaría para ejecutar una FUNCIÓN (un código de base de datos que devuelve un valor único) y esperaría que le dé el valor de retorno de la función aunque las funciones devuelvan valores únicos. Sin embargo, si está ejecutando la función como parte de una consulta, por ejemplo, SELECT SUBSTR ('abc', 1, 1) FROM DUAL, entonces daría el valor de retorno en virtud del hecho de que el valor de retorno se almacena en la parte superior izquierda celda del conjunto de filas resultante

ExecuteNonQuery se usaría para ejecutar procedimientos almacenados de la base de datos, funciones y consultas que modifican datos (INSERT / UPDATE / DELETE) o modifican la estructura de la base de datos (CREATE TABLE ...). Normalmente, el valor de retorno de la llamada es una indicación de cuántas filas se vieron afectadas por la operación, pero consulte la documentación de la base de datos para garantizar esto.

Mate
fuente
4

ExecuteReader() ejecuta una consulta SQL que devuelve el objeto DBDataReader del proveedor de datos que proporciona acceso de solo lectura y reenvío para el resultado de la consulta.

ExecuteScalar()es similar al ExecuteReader()método diseñado para consultas de singleton, como obtener un recuento de registros.

ExecuteNonQuery() ejecutar una consulta que no funcione con crear, eliminar, actualizar, insertar)

Rogers
fuente
3

ExecuteNonQuery

Este método ExecuteNonQuery se utilizará solo para insertar, actualizar y eliminar, crear y establecer instrucciones. El método ExecuteNonQuery devolverá el número de filas efectuadas con las operaciones INSERT, DELETE o UPDATE.

Ejecutar Escalar

Es muy rápido recuperar valores individuales de la base de datos. Execute Scalar devolverá un valor de una sola columna de una sola fila, es decir, un valor único, al ejecutar una consulta SQL o un procedimiento almacenado utilizando el objeto de comando. ExecuteReader

Execute Reader se utilizará para devolver el conjunto de filas, en la ejecución de la consulta SQL o el procedimiento almacenado utilizando el objeto de comando. Este es solo una recuperación de registros hacia adelante y se usa para leer los valores de la tabla desde el primero hasta el último.

Shailendra Mishra
fuente
3

El método ExecuteNonQuery devolverá el número de filas efectuadas con las operaciones INSERT, DELETE o UPDATE. Este método ExecuteNonQuery se utilizará solo para insertar, actualizar y eliminar, crear y establecer instrucciones. (Lee mas)

ExecuteScalar devolverá el valor de una sola fila y una sola columna, es decir, un valor único, en la ejecución de una consulta SQL o un procedimiento almacenado utilizando el objeto de comando. Es muy rápido recuperar valores individuales de la base de datos. (Lee mas)

ExecuteReader se utilizará para devolver el conjunto de filas, en la ejecución de la consulta SQL o el procedimiento almacenado utilizando el objeto de comando. Este es solo una recuperación de registros hacia adelante y se usa para leer los valores de la tabla desde el primero hasta el último. (Lee mas)

Zia Ur Rahman
fuente
1

ExecuteNonQuery: se usa generalmente cuando no se devuelve nada de las declaraciones Sql como operaciones de inserción, actualización y eliminación.

cmd.ExcecuteNonQuery();

ExecuteScalar:

Se utilizará cuando la consulta SQL devuelva un valor único.

Int b = cmd.ExcecuteScalar();

ExecuteReader

Se utilizará cuando la consulta Sql o el procedimiento almacenado devuelvan varias filas / columnas

SqlDataReader dr = cmd.ExecuteReader();

para obtener más información, puede hacer clic aquí http://www.dotnetqueries.com/Article/148/-difference-between-executescalar-executereader-executenonquery

DotNetLover
fuente