dapper c # devuelve las filas encontradas, no las filas afectadas

c# dapper mysql

Pregunta

Tengo un procedimiento almacenado simple que se actualiza en una tabla.

CREATE PROCEDURE `test_v1`(
out v_changed_rows int
)
BEGIN
    update mytable
    set color = 'green'
    where id = 964291; 
    set v_changed_rows= ROW_COUNT();
END

Llamar a este procedimiento almacenado desde mysql workbench da las filas correctas afectadas (es decir, la primera vez devolverá 1 y, por lo tanto, devuelve 0 porque lo estoy actualizando con el mismo valor y, por lo tanto, no hay cambios)

enter image description here

El problema surge cuando llamo a este procedimiento almacenado desde C # enter image description here

Intenté llamar a esta consulta en un ciclo for y cada vez devuelve 1 . ¿Cómo obtengo las filas afectadas por la consulta, no las filas encontradas por la consulta? Gracias.

Respuesta aceptada

Existe una nota para la función ROW_COUNT () :

Para las instrucciones UPDATE, el valor de las filas afectadas por defecto es el número de filas realmente modificadas. Si especifica el indicador CLIENT_FOUND_ROWS a mysql_real_connect () cuando se conecta a mysqld, el valor de las filas afectadas es el número de filas "encontradas"; es decir, emparejado por la cláusula WHERE.

Aunque dice que el número de filas realmente modificadas se devuelve por defecto, para el cliente .Net de MySql, el comportamiento predeterminado es devolver el número de filas que coinciden con la cláusula WHERE. Esto debería deberse al valor del parámetro client_flag pasado a mysql_real_connect .

Puede cambiar este comportamiento al establecer explícitamente UseAffectedRows en True en su cadena de conexión:

server = localhost; user id = test; password = test; database = test; UseAffectedRows = True

Lo he intentado y funciona perfectamente bien con ADO.NET y Dapper.


Respuesta popular

Puedes utilizar en tu procedimiento almacenado RETURN @@ROWCOUNT Y dentro de tu método haz algo así:

var dynamicParameters = new DynamicParameters();
dynamicParameters.Add("@UpdatedCounter", dbType: DbType.Int32, direction: ParameterDirection.ReturnValue);
var result = await _connection.ExecuteAsync("sp_Update", dynamicParameters, commandType: CommandType.StoredProcedure);
int updatedCounter = dynamicParameters.Get<int>("@UpdatedCounter");
return updatedCounter;


Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué