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

C# dapper c返回找到的行,但不受影响的行,c#,mysql,dapper,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调用此存储过程会得到影响edi.e的正确行。第一次它将返回1,因此第四次返回0,因为我正在

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

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调用此存储过程会得到影响edi.e的正确行。第一次它将返回1,因此第四次返回0,因为我正在用相同的值更新它,因此没有更改

当我从C调用这个存储过程时,问题就出现了

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

有这样的功能说明:

对于UPDATE语句,默认情况下受影响的行值为 实际更改的行数。如果您指定客户端\u FOUND\u行 连接到mysqld时,标记为mysql\u real\u connect “受影响的行”值是“找到”的行数;也就是说,与之相匹配的 WHERE子句

虽然它说默认情况下返回实际更改的行数,但对于MySql.Net客户端,默认行为是返回与WHERE子句匹配的行数。这应该是由于传递给的client_flag参数的值造成的

您可以通过在连接字符串中显式设置为True来更改此行为:

服务器=本地主机;使用者 id=试验;密码=测试;数据库=测试;UseAffectedRows=True


我已经尝试过了,它在ADO.NET和Dapper上都运行得非常好。

您可以在存储过程RETURN@@ROWCOUNT中使用它 在您的方法中,smth是这样做的:

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;

我还没试过。我想我也会试试。我们使用dapper作为我们的ORMSo,我用ado.net尝试过,我仍然得到1作为答案。所以问题在于mysql端?检查连接字符串并检查它是否指向您认为是的数据库。还要检查存储过程定义,这是您认为的。然后从mytable中运行select*,其中id=964291;针对那个数据库。