C#MYSQL - ON DUPLICATE KEY UPDATE - 相同查询不同的结果

时间:2016-01-12 12:54:36

标签: c# mysql

在我的测试应用中;当我反复运行此查询时,即使没有更改,我也会获得正行计数。

insert into  test (k,v) values ('testkey',123) 
on duplicate key update v=values(v);

查询在MySQL控制台和MySQL Workbench中按预期工作。我为第一个插入获得1,为连续调用获得0。

然而,当我尝试使用我的C#测试应用程序时,即使行内没有任何变化,我也总是得到2。

有什么想法吗?我在设置连接时遗漏了什么?

这是我的测试表:

CREATE TABLE `test` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `k` varchar(45) DEFAULT NULL,
  `v` varchar(45) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `icol_UNIQUE` (`k`)
) ENGINE=MyISAM AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;

这是我的小测试代码:

using (var con = new MySqlConnection("Database=mydb;Data Source=localhost;User Id=root;Password=mypass;CharSet=utf8;"))
    {
        con.Open();
        var cmd = new MySqlCommand("insert into  test (k,v) values ('testkey',123) on duplicate key update v=values(v)", con);
        var rows = cmd.ExecuteNonQuery();

        Console.WriteLine(rows); // rows is always 2
    }

注意:

  • 我正在使用MySql .Net Connector 6.9.8
  • 所有数据库charset / collat​​ion 设置是utf8

1 个答案:

答案 0 :(得分:0)

最后在阅读下面的手册后找到了解决方案 https://downloads.mysql.com/docs/connector-net-en.pdf

有一个名为Use Affected Rows,UseAffectedRows

的连接选项

其默认值设置为false。

描述说:

  

如果为true,则连接报告已更改的行而不是找到的行。   此选项已在Connector / Net版本5.2.6中添加。

使用时;连接到服务器时不设置CLIENT_FOUND_ROWS标志

似乎MySQL Workbench和MySQL命令行在连接期间不使用CLIENT_FOUND_ROWS标志,默认情况下MySql .Net Connector使用它。

来自INSERT ... ON DUPLICATE KEY UPDATE文件 https://dev.mysql.com/doc/refman/5.7/en/insert-on-duplicate.html

  

如果ON DUPLICATE KEY UPDATE,则每行的受影响行值为1   该行将作为新行插入,如果更新现有行,则为2   如果现有行设置为其当前值,则为0。如果你指定   连接时,CLIENT_FOUND_ROWS标志为mysql_real_connect()   mysqld,如果设置了现有行,则受影响的行值为1(不为0)   目前的价值观。

<强>解决方案: 将其添加到连接字符串

Use Affected Rows=true