You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C# ExecuteNonQuery执行带ON DUPLICATE的INSERT返回行数异常

解决.NET Core中MySQL Connector执行INSERT...ON DUPLICATE KEY UPDATE时返回行数不符的问题

问题原因

MySQL Connector/NET 默认情况下,ExecuteNonQuery() 返回的是匹配的行数(包含所有尝试插入的行,无论最终是插入成功还是被更新覆盖),而非实际插入的新行数,这和HeidiSQL的返回逻辑不一致,导致业务统计出错。

解决方案

方案1:修改连接字符串启用UseAffectedRows参数

在数据库连接字符串中添加UseAffectedRows=True,让ExecuteNonQuery()返回实际受影响的行数:

  • 插入新行时返回1
  • 遇到重复数据且未修改任何字段时返回0
  • 遇到重复数据且成功更新字段时返回1

示例连接字符串:

string connectionString = "server=你的服务器地址;database=你的数据库名;user=用户名;password=密码;UseAffectedRows=True;";

调用ExecuteNonQuery()后,可根据返回值判断业务状态;若要严格区分插入/更新操作,可结合288423:插入新行时该方法会返回新行的自增ID,更新操作则保持原有ID值不变。

方案2:通过ROW_COUNT()函数获取准确行数

如果不想修改连接字符串,可在执行INSERT语句后立即执行SELECT ROW_COUNT();,通过ExecuteScalar()读取实际受影响行数。

示例代码:

using MySqlConnection conn = new MySqlConnection(connectionString);
conn.Open();

using MySqlCommand cmd = conn.CreateCommand();
cmd.CommandText = @"
INSERT INTO your_table (id, name) VALUES (@id, @name)
ON DUPLICATE KEY UPDATE name = VALUES(name);
SELECT ROW_COUNT();
";
cmd.Parameters.AddWithValue("@id", 1);
cmd.Parameters.AddWithValue("@name", "test");

int affectedRows = Convert.ToInt32(cmd.ExecuteScalar());
// affectedRows 为实际受影响行数:插入新行返回1,无修改的重复返回0,更新字段返回1

若需严格统计仅插入的行数,可在ON DUPLICATE KEY UPDATE中添加自增标记字段,或结合288423与插入ID对比(仅适用于自增主键场景)。

内容的提问来源于stack exchange,提问作者Hadrien Debris

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 19:40:59