ExecuteNonQuery no devuelve resultados

Este es mi código (aproximado) (DAL):

int i; // Some other declarations SqlCommand myCmdObject = new SqlCommand("some query"); conn.open(); i = myCmdObject.ExecuteNonQuery(); conn.close(); 

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

¿Cual podría ser el problema?

¿Qué tipo de consulta llevas a cabo? El uso de ExecuteNonQuery está destinado a UPDATE , INSERT y DELETE consultas. Según la documentación :

Para las sentencias UPDATE, INSERT y DELETE, el valor de retorno es el número de filas afectadas por el comando. Cuando existe un desencadenante en una tabla que se inserta o actualiza, el valor de retorno incluye el número de filas afectadas por la operación de inserción o actualización y el número de filas afectadas por el desencadenante o desencadenantes. Para todos los demás tipos de declaraciones, el valor de retorno es -1.

Siempre que desee ejecutar una instrucción SQL que no debe devolver un valor o un conjunto de registros, se debe utilizar ExecuteNonQuery.

Por lo tanto, si desea ejecutar una statement de actualización, eliminar o insertar, debe usar ExecuteNonQuery. ExecuteNonQuery devuelve el número de filas afectadas por la statement. 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 statement.

¡Feliz progtwigción!

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

Utiliza EXECUTENONQUERY() para INSERT , UPDATE y DELETE .

Pero para SELECT debe usar EXECUTEREADER() ………

Porque la opción ESTABLECER NOCOUNT está activada. Elimine la línea “SET NOCOUNT ON”; en su consulta o procedimiento almacenado.

Ver más en SqlCommand.ExecuteNonQuery () devuelve -1 cuando se hace Insert / Update / Delete .

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

El método ExecuteNonQuery se usa para declaraciones de SQL que no son consultas, como INSERT , UPDATE , … Desea utilizar ExecuteScalar o ExecuteReader si espera que su instrucción ExecuteScalar resultados (es decir, una consulta).

Si lo que desea es obtener solo un entero de la consulta, use:

 myCmdObject.ExecuteScalar() 

si desea ejecutar una statement de actualización, eliminar o insertar, debe usar ExecuteNonQuery. ExecuteNonQuery devuelve el número de filas afectadas por la statement.

Cómo configurar el conteo

Desde MSDN: Método SqlCommand.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 cambiar los datos en una base de datos sin usar un DataSet ejecutando instrucciones UPDATE, INSERT o DELETE.

Aunque ExecuteNonQuery no devuelve ninguna fila, los parámetros de salida o los valores de retorno asignados a los parámetros se rellenan con datos.

Para las sentencias UPDATE, INSERT y DELETE, el valor de retorno es el número de filas afectadas por el comando. Cuando existe un desencadenante en una tabla que se inserta o actualiza, el valor de retorno incluye el número de filas afectadas por la operación de inserción o actualización y el número de filas afectadas por el desencadenante 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 también es -1.

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