dapper c#返回的行找不到受影响的行

时间:2018-02-10 11:28:56

标签: c# mysql dapper

我有一个简单的存储过程,可以在表上进行更新。

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

从mysql workbench调用这个存储过程会给出正确的行影响(即第一次返回1,因此返回0,因为我用相同的值更新它,因此没有变化)

enter image description here

当我从C#调用此存储过程时出现问题 enter image description here

我尝试在for循环中调用此查询,并且每次返回1。 如何获取受查询影响的行,而不是查询找到的行? 感谢。

2 个答案:

答案 0 :(得分:4)

ROW_COUNT()函数有这样的注释:

  

对于UPDATE语句,默认情况下受影响的行值为   实际更改的行数。如果指定CLIENT_FOUND_ROWS   当连接到mysqld时,标记为mysql_real_connect()   affected-rows value是“找到”的行数;也就是说,匹配   WHERE子句。

虽然它表示默认返回实际更改的行数,但对于MySql .Net客户端,默认行为是返回WHERE子句匹配的行数。这应该归因于传递给mysql_real_connectclient_flag参数的值。

您可以通过在连接字符串中明确将UseAffectedRows设置为True来更改此行为:

  

服务器=本地主机;用户   ID =测试;密码=试验;数据库=测试; UseAffectedRows =真

我已经尝试过,无论是使用ADO.NET还是Dapper,它都能正常运行。

答案 1 :(得分:0)

您可以在存储过程RETURN @@ROWCOUNT中使用 在你的方法里面做的就像那样:

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;