【问题标题】:Concurrency violation: the DeleteCommand affected 0 of the expected 1 records并发冲突:DeleteCommand 影响了预期的 1 条记录中的 0 条
【发布时间】:2012-05-29 11:50:52
【问题描述】:

我正在尝试从 datagridview 中删除一条记录,然后将其更新到 mysql 服务器,但是我一直收到“并发冲突:DeleteCommand 影响了预期的 1 条记录中的 0 条。”。我已经用谷歌搜索并弄乱了它,无法找到解决爱情和金钱的方法。我哪里错了?

    private void Form1_Load(object sender, EventArgs e)
    {
        try
        {
            // create a connection to the server
            connection = new MySqlConnection("SERVER=" + Constants.SERVER + ";" + "DATABASE=" + Constants.DATABASE + ";UID=" + Constants.USERNAME + ";" + "PASSWORD=" + Constants.PASSWORD + ";");
            connection.Open();

            // create our default handler
            adapter = new MySqlDataAdapter();

            // set the default commands to do
            adapter.SelectCommand = new MySqlCommand("SELECT * FROM npc_drops", connection);
            MySqlCommand query = new MySqlCommand("DELETE FROM npc_drops WHERE id = @id", connection);
            query.Parameters.Add("@id", MySqlDbType.Int32, 10, "id");
            adapter.DeleteCommand = query;

            // create a table to put our data in and fill it with the results
            table = new DataTable();
            adapter.Fill(table);

            // bind both the data table and the datagridview togeather
            BindingSource source = new BindingSource();
            source.DataSource = table;
            dataGridView1.DataSource = source;
            dataGridView1.Columns["id"].Visible = false;
        }
        catch (MySqlException ex)
        {
            MessageBox.Show(ex.Message);
        }
    }

    private void button1_Click(object sender, EventArgs e)
    {
        try
        {
            table = table.GetChanges();
            adapter.Update(table);
        }
        catch (MySqlException ex)
        {
            MessageBox.Show(ex.Message);
        }
    }

表:

CREATE TABLE `npc_drops` (
    `id` INT(10) NULL AUTO_INCREMENT,
    `npcs` VARCHAR(250) NULL DEFAULT NULL,
    `rate` INT(3) NULL DEFAULT NULL,
    `item` INT(5) NULL DEFAULT NULL,
    `amount` INT(10) NULL DEFAULT NULL,
    PRIMARY KEY (`id`)
)

【问题讨论】:

  • @BizApps 谢谢我已经更新了那行,但仍然收到同样可怕的错误!
  • - 你的表使用的是 INNODB 还是 MISAM? - 你在使用自动提交吗?
  • MySQL 不要求参数以 : 为前缀,即 :id 吗?

标签: c# mysql


【解决方案1】:

由于上面提到的 NULL 问题,您可以尝试在数据集的生成方法上关闭“乐观并发”。

【讨论】:

    【解决方案2】:

    当您尝试删除实际数据库中不匹配的记录时会发生并发异常,这发生在新添加的具有标识列的记录中,因为数据集不会在添加后立即检索标识列值。 您需要解决此问题

    1-通过执行 SQL 命令从数据库中检索标识列值,然后使用该值更新数据集中的记录。


    2-您可以通过调用来接受对数据库数据表的更改:

    table.AcceptChanges();
    

    然后在通过调用重新填充数据表后立即

    Adapter.Fill(table);
    

    【讨论】:

    • 我知道这是旧的,但如果你有一个事务对象并在 .AcceptChanges() 之前调用它的提交,会发生这种情况吗? (即提交应该在 AccpectChanges 之后)
    【解决方案3】:

    我知道这是一个旧线程,但我遇到了同样的问题并找到了解决方案。也许其他人会在这里看到它。

    使用 Visual Studio,在 .xsd 文件中,数据适配器中有一个 DELETE 命令。该命令采用 SQL“DELETE from table where column1 = @Original_column1 AND column2 = @Original_column2 AND...”的形式,默认情况下,它将所有列与您读取 db 时的值进行比较,并且不会删除记录,除非它们都匹配。这是为了避免在您阅读记录和尝试更改记录之间覆盖其他人所做的更改。

    这就是问题所在。如果数据库中这些列中的任何一个为 NULL,则它不会像您描述的那样匹配并出错。

    PS:在使用 VS 数据库库时,我在数据库中允许 NULL 时遇到了麻烦。 LINQ2SQL 或任何它被称为...

    【讨论】:

      【解决方案4】:

      并发异常意味着更改的行数比预期的要少,这通常发生在更新/删除的 where 子句阻止操作执行时。 (这通常是并发的工作方式 - 您使用 where 检查 LastUpdateDate 没有更改,以验证没有人在您的读写操作之间进行) 唯一删除的地方是“id = @id”,所以问题一定是执行DeleteCommand时id在DB中不存在。

      我发现你的代码有两个问题:

      1. 不要重复使用“表”进行更改,而是使用新的 DataTable。
      2. 更新后调用 table.AcceptChanges(),这将从 DataTable 中删除已删除的条目。

      问题可能是由于删除的行被保留并再次删除,或者在删除之前删除条目的其他操作(在后一种情况下,您需要处理并发异常)

      【讨论】:

        猜你喜欢
        • 2017-06-08
        • 2010-12-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多