我有一个简单的存储过程,可以在表上进行更新。
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,因为我用相同的值更新它,因此没有变化)
我尝试在for
循环中调用此查询,并且每次返回1
。
如何获取受查询影响的行,而不是查询找到的行?
感谢。
答案 0 :(得分:4)
ROW_COUNT()函数有这样的注释:
对于UPDATE语句,默认情况下受影响的行值为 实际更改的行数。如果指定CLIENT_FOUND_ROWS 当连接到mysqld时,标记为mysql_real_connect() affected-rows value是“找到”的行数;也就是说,匹配 WHERE子句。
虽然它表示默认返回实际更改的行数,但对于MySql .Net客户端,默认行为是返回WHERE子句匹配的行数。这应该归因于传递给mysql_real_connect的client_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;