c# - ExecuteNonQuery que devuelve-1 cuando se utiliza sql COUNT a pesar de la cadena de consulta
sql-server ado.net (2)
Basado en MSDN :
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 los 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.
Desea devolver el número de filas afectadas por el comando y guardarlo en una variable
int
, pero dado que el tipo de instrucción es
select
, devuelve
-1
.
Solución
: si desea obtener el número de filas afectadas por el comando SELECT y guardarlo en una variable int, puede usar
ExecuteScalar
.
var theCount = (int)cmd.ExecuteScalar();
Por alguna razón,
ExecuteNonQuery()
en C # devuelve
-1
, aunque cuando ejecuto una consulta por separado, el valor devuelve el valor real necesario.
Por ejemplo:
try
{
var connString ="Data Source=ServerName;InitialCatalog=DatabaseName;Integrated Security=true;"
SqlConnection conn = new SqlConnection(connString);
SqlCommand someCmd = new SqlCommand("SELECT COUNT(*) FROM SomeTable");
someCmd.Connection = conn;
conn.Open();
var theCount = cmd.ExecuteNonQuery();
conn.Close();
}
catch(Exception ex)
{
Console.WriteLine(ex.Message);
}
Cuando se ejecuta el comando, devuelve
-1
.
Aunque si ejecuta la consulta por separado,
SELECT COUNT(*) FROM SomeTable;
La columna devuelve una fila con un recuento de
4
si la tabla que se consulta tiene
4
filas.
Puede usar Ef core con Ado.net como este ejemplo
var context = new SampleDbContext();
using (var connection = context.Database.GetDbConnection())
{
connection.Open();
using (var command = connection.CreateCommand())
{
command.CommandText = "SELECT COUNT(*) FROM SomeTable";
var result = command.ExecuteScalar().ToString();
}
}