2011-03-18 1094 views
12

Este es mi código (en bruto) (DAL):ExecuteNonQuery()

int i; 
// Some other declarations 

SqlCommand myCmdObject = new SqlCommand("some query"); 

conn.open(); 
i = myCmdObject.ExecuteNonQuery(); 
conn.close(); 

El problema es: A pesar de que hay un registro presente en mi SELECT consulta, el valor de i permanece -1.

¿Cuál podría ser el problema?

Respuesta

39

¿Qué tipo de consulta realizan? El uso de ExecuteNonQuery está destinado a las consultas UPDATE, INSERT y DELETE. Según the documentation:

Para UPDATE, INSERT y DELETE declaraciones, el valor de retorno es el número de filas afectadas por el comando . Cuando existe un disparador en una tabla ser insertado o actualizado, el valor de retorno incluye el número de filas afectadas tanto por la inserción o operación de actualización y el número de filas afectadas por el gatillo o desencadenantes. Para todos los demás tipos de declaraciones , el valor de retorno es -1.

+1

¿Cuál es el valor de retorno, si ejecutamos un StoredProcedure que insertará o actualizará o eliminará un registro en un Mesa, – Raghuveer

1

¿Podría publicar la consulta exacta? El método ExecuteNonQuery devuelve la variable del servidor Sql @@ROWCOUNT, lo que sea después de que se haya ejecutado la última consulta es lo que devuelve el método ExecuteNonQuery.

1

Si lo que desea es obtener un solo número entero de la consulta, utilice:

myCmdObject.ExecuteScalar() 
+0

ExecuteScalar solo devolverá el valor que sea el primer valor de columna de la primera fila en la consulta ejecutada. –

+0

Eso es cierto, pero como dije al seleccionar un entero simple, se supone que está en la primera columna de la primera fila :) – IordanTanev

1

El método ExecuteNonQuery se utiliza para las sentencias SQL que son no consultas, tales como INSERT, UPDATE, ... Usted desea utilizar ExecuteScalar o ExecuteReader si espera que su estado de cuenta para volver resultados (es decir, una consulta) .

0

De MSDN: SqlCommand.ExecuteNonQuery Method

Puede utilizar el ExecuteNonQuery para realizar operaciones de catálogo (por ejemplo, la consulta de la estructura de una base de datos o la creación de base de datos de objetos tales como tablas), o para cambiar el datos en una base de datos sin utilizar un DataSet ejecutando las instrucciones UPDATE, INSERT o DELETE .

Aunque el ExecuteNonQuery devuelve no hay filas, los parámetros de salida o valores de retorno mapeados a parámetros están poblada con datos.

Para UPDATE, INSERT y DELETE declaraciones, el valor de retorno es el número de filas afectadas por el comando . Cuando existe un disparador en una tabla ser insertado o actualizado, el valor de retorno incluye el número de filas afectadas tanto por la inserción o operación de actualización y el número de filas afectadas por el gatillo o desencadenantes.Para todos los demás tipos de declaraciones , el valor de retorno es -1. Si ocurre una reversión, el valor de retorno es también -1.

Está utilizando consulta SELECT, por lo tanto se obtiene -1

0

si desea ejecutar una actualización, eliminar o instrucción de inserción, se debe utilizar el ExecuteNonQuery. ExecuteNonQuery devuelve el número de filas afectadas por la instrucción.

How to Set Count On

5

Se utilizan para EXECUTENONQUERY()INSERT, UPDATE y DELETE.

Pero para SELECT debe utilizar EXECUTEREADER() .........

11

Cada vez que desee ejecutar una sentencia de SQL que no debe devolver un valor o un conjunto de registros, la ExecuteNonQuery debe ser utilizado.

Por lo tanto, si desea ejecutar una declaración de actualización, eliminar o insertar, debe utilizar ExecuteNonQuery. ExecuteNonQuery devuelve el número de filas afectadas por la declaración. Esto suena muy bien, pero cada vez que utiliza el SQL Server 2005 IDE o Visual Studio para crear un procedimiento almacenado, agrega una pequeña línea que arruina todo.

Esa línea es: SET NOCOUNT ON; Esta línea activa la característica NOCOUNT de SQL Server, que "Detiene el mensaje que indica el número de filas afectadas por una instrucción de Transact-SQL que se devuelve como parte de los resultados" y, por lo tanto, hace que el procedimiento almacenado siempre devuelva -1 cuando llamado desde la aplicación (en mi caso, una aplicación web).

En conclusión, elimine esa línea de su procedimiento almacenado, y ahora obtendrá un valor que indica el número de filas afectadas por la instrucción.

¡Feliz programación!

http://aspsoft.blogs.com/jonas/2006/10/executenonquery.html

Cuestiones relacionadas