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()
.........