c# - returns - executescalar
ExecuteNonQuery no devuelve resultados (9)
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 en -1 .
¿Cual podría ser el problema?
Si desea ejecutar una actualización, eliminar o insertar una declaración, debe usar ExecuteNonQuery. ExecuteNonQuery devuelve el número de filas afectadas por la instrucción.
¿Podrías publicar la consulta exacta? El método ExecuteNonQuery devuelve la @@ROWCOUNT Sql Server lo que sea después de que se haya ejecutado la última consulta es lo que ExecuteNonQuery método ExecuteNonQuery .
¿Qué tipo de consulta realizas? El uso de ExecuteNonQuery está destinado a consultas de UPDATE , INSERT y DELETE . Según la documentación :
Para las declaraciones UPDATE, INSERT y DELETE, el valor de retorno es el número de filas afectadas por el comando. Cuando existe un activador 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 activador o activadores. Para todos los demás tipos de declaraciones, el valor de retorno es -1.
Desde MSDN: SqlCommand.ExecuteNonQuery Method
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 las instrucciones UPDATE, INSERT o DELETE.
Aunque ExecuteNonQuery no devuelve filas, todos los parámetros de salida o los valores de retorno asignados a los parámetros se completan con datos.
Para las declaraciones UPDATE, INSERT y DELETE, el valor de retorno es el número de filas afectadas por el comando. Cuando existe un activador 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 activador o activadores. Para todos los demás tipos de declaraciones, el valor de retorno es -1 . Si se produce una reversión, el valor de retorno también es -1.
Está utilizando la consulta SELECT, por lo tanto, obtiene -1
El método ExecuteNonQuery se usa para sentencias de SQL que no son consultas, como INSERT , UPDATE , ... Desea usar ExecuteScalar o ExecuteReader si espera que su sentencia devuelva resultados (es decir, una consulta).
Porque la opción SET NOCOUNT está activada. Eliminar la línea "SET NOCOUNT ON;" En su consulta o procedimiento almacenado.
Ver más en SqlCommand.ExecuteNonQuery () devuelve -1 al hacer Insertar / Actualizar / Eliminar .
Si lo que desea es obtener un solo entero de la consulta, use:
myCmdObject.ExecuteScalar()
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 actualización, eliminar o insertar una declaración, debe usar ExecuteNonQuery. ExecuteNonQuery devuelve el número de filas afectadas por la instrucción. Esto suena muy bien, pero siempre que use el IDE de SQL Server 2005 o Visual Studio para crear un procedimiento almacenado, se agrega una pequeña línea que arruina todo.
Esa línea es: SET NOCOUNT ON; Esta línea activa la función NOCOUNT de SQL Server, que "Detiene el mensaje que indica que la cantidad de filas afectadas por una instrucción Transact-SQL 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 declaración.
¡Feliz programación!
Utiliza EXECUTENONQUERY() para INSERT , UPDATE y DELETE .
Pero para SELECT debes usar EXECUTEREADER() .........