c# sql sql-server ado.net executenonquery

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(); } }