2011-11-14 39 views
8

He usado este método antes para devolver la cantidad de filas modificadas. Estoy para ejecutar un método de inserción, la inserción funciona bien en el procedimiento almacenado, pero el valor de retorno de ExecuteNonQuery siempre devuelve -1.C#: ExecuteNonQuery() devuelve -1

Aquí está mi código C#:

int ret = 0; 

using (SqlConnection conn = new SqlConnection(this.ConnectionString)) 
{ 
    using (SqlCommand cmd = new SqlCommand(QueryName, conn)) 
    { 
     conn.Open(); 

     if (Params != null) 
      cmd.Parameters.AddRange(Params); 

     cmd.CommandType = CommandType.StoredProcedure; 

     ret = cmd.ExecuteNonQuery(); 

     conn.Close(); 
    } 
} 

return ret; 

¿Por qué recibo -1 en lugar del número real de filas cambiado?

+0

¿Entonces las modificaciones en la tabla realmente tienen lugar pero usted obtiene -1? – Tudor

+0

Probablemente devuelva lo que sea que retorne tu sproc, que probablemente sea -1 si no se especifica lo contrario ... –

+0

¿Has capturado realmente la llamada SQL usando el generador de perfiles y se ha ejecutado manualmente para ver el número de fila cambiado real? –

Respuesta

21

Si se utiliza este método para llamar a un procedimiento almacenado que realizan ACTUALIZACIÓN/INSERT en una tabla el retorno método -1 si el procudere almacenado tiene el valor SET NOCOUNT en ON.

- source

5

De Microsoft:

Para 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.

http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.executenonquery.aspx

Usted probablemente está recibiendo -1 porque está utilizando un procedimiento almacenado y no un cambio directo a las tablas

0

¿Qué valor se le Regresar de un procedimiento almacenado? Puede mostrar el código para su procedimiento almacenado. Probablemente necesite editar su procedimiento almacenado para devolver el valor requerido, O, su procedimiento almacenado está devolviendo un -1 específicamente o la variable que devuelve el procedimiento almacenado tiene -1 como su valor.

0

Obtenga la salida de recuento de filas del procedimiento almacenado algo así como usar @[email protected]@Rowcount. En el DAL, use dbManager.AddOutParameter("RowCount", DbType.Int32, rowCount); Luego en las filas finales obtendrá como (int)dbManager.GetParameterValue("RowCount").

Cuestiones relacionadas