C#MYSQL-重复密钥更新-相同查询不同结果

C#MYSQL-重复密钥更新-相同查询不同结果,c#,mysql,C#,Mysql,在我的测试应用程序中;当我反复运行此查询时,即使没有任何更改,结果也是行数为正 insert into test (k,v) values ('testkey',123) on duplicate key update v=values(v); 查询在MySQL控制台和MySQL工作台中按预期工作。第一次插入得到1,连续调用得到0 然而,当我在我的C#test应用程序中尝试时,我总是得到2,即使行内没有任何变化 有什么想法吗?设置连接时我是否遗漏了什么 这是我的测试表: CREATE TA

在我的测试应用程序中;当我反复运行此查询时,即使没有任何更改,结果也是行数为正

insert into  test (k,v) values ('testkey',123) 
on duplicate key update v=values(v);
查询在MySQL控制台和MySQL工作台中按预期工作。第一次插入得到1,连续调用得到0

然而,当我在我的C#test应用程序中尝试时,我总是得到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
  • 所有数据库字符集/排序规则 设置为utf8

阅读下面的手册后,终于找到了解决方案

有一个名为“使用受影响的行”的连接选项,即“使用受影响的行”

其默认值设置为false

描述说:

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

使用时;连接到服务器时未设置客户端\u找到\u行标志

MySQL Workbench和MySQL命令行似乎在连接期间不使用CLIENT\u FOUND\u ROWS标志,默认情况下,MySQL.Net连接器使用该标志

从插入。。。关于重复密钥更新文档,请访问

在重复密钥更新时,如果发生以下情况,则每行受影响的行值为1 该行将作为新行插入,如果更新了现有行,则为2,并且 如果现有行设置为其当前值,则为0。如果指定 连接到时,客户端\u找到\u行标志为mysql\u real\u connect() mysqld,如果设置了现有行,则受影响的行值为1(不是0) 恢复到其当前值

解决方案: 将其添加到连接字符串中

Use Affected Rows=true

在文档中,它指出“(对于InnoDB表,a是一个自动增量列。对于一个自动增量列,INSERT语句会增加自动增量值,但UPDATE不会。)”因此这可能是相关的@AndyNichols我的问题不是关于自动增量id。问题是在没有更改的情况下返回的受影响行的数量。问题是特定于应用程序的。一年后,它在控制台中工作没有问题。我还有同样的问题使用.Net连接器运行“在重复密钥更新时”查询时,即使行没有更改,也始终返回正整数。-然而,同一个查询在MySQL控制台和MySQL工作台中的工作原理与预期相同,在没有更改时返回“0行受影响”,这在我看来似乎是一个bug。有什么想法吗?