【问题标题】:Concurrency violation while trying to update database (Only on specific table)尝试更新数据库时并发冲突(仅在特定表上)
【发布时间】:2014-10-14 22:44:24
【问题描述】:

这个问题快把我逼疯了。

我正在尝试使用 MySQL 数据适配器更新数据集。此方法适用于我数据库中的其他表,它只是发生在此表中。下面是代码示例:

    String query = "select * from accounts";
    DataSet dataSet = new DataSet();
    connection.Open();
    MySqlDataAdapter dataAdapter = new MySqlDataAdapter(query, (MySqlConnection)connection);
    MySqlCommandBuilder commandBuilder = new MySqlCommandBuilder(dataAdapter);
    dataAdapter.FillSchema(dataSet, SchemaType.Source);
    commandBuilder.RefreshSchema();
    dataAdapter.Fill(dataSet);

    dataSet.Tables[0].Rows[0]["balance"] = 1M;
    dataAdapter.Update(dataSet);

一旦它尝试更新它就会抛出异常。请记住,这是我的代码的简化示例,但它得到了相同的结果。

我已经研究了这个错误,我只能找到:
1) 如果此数据自填充后已被其他用户更改
2)如果该行不存在。

但是其他用户不可能更改数据,因为这发生在我的开发机器上。该行显然存在,因为它不会在 Rows[0] 处引发异常。

正如我所说,这只发生在这张桌子上。该表有一个 int 作为主键,而我要更新的列是一个 Decimal,所以我不知道问题出在哪里。

感谢您的建议。

【问题讨论】:

  • 在代码中看不到任何内容。我认为不是你的问题,但我应该指出行不存在时。这意味着在表中,即认为更新语句对应于不存在的行。你确定你的钥匙在桌子上没有问题吗?您得到此信息的另一个原因是如果无法唯一标识该行。即 select * from Table Where ID =1 返回除 1 行之外的任何内容。不太可能,但我已经看到它发生了,出于某种原因
  • 不确定这是否会有所帮助,但几年前我遇到了类似的问题,使用不同的数据库。 IIRC 这是某种映射问题,其中日期存储为数字或类似的。当该行被发送回数据库时,数据库发现值不一样并抱怨数据已更改(即使没有更改)。也许您可以查看 DataSet 的定义并与 DB 进行比较?不确定。

标签: c# mysql


【解决方案1】:

我知道这是不久前发布的,但我刚刚找到了解决问题的方法:

似乎问题出在表结构或类似的东西上。我在表上做了一个 mysqldump,然后只导入了转储(它基本上是从头开始构建表)。在我这样做之后,一切都像魅力一样。

希望我可以帮助遇到这个奇怪问题的其他人。

【讨论】:

    猜你喜欢
    • 2014-04-24
    • 2010-12-18
    • 2018-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多