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
相关产品推荐
相关产品推荐

