10

我正在尝试从 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`)
)
4

4 回答 4

6

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

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

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

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

于 2013-07-08T18:53:19.757 回答
3

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

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


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

table.AcceptChanges();

然后在通过调用重新填充您的数据表之后

Adapter.Fill(table);
于 2014-12-27T03:04:08.410 回答
0

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

我可以看到您的代码有两个问题:

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

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

于 2012-11-26T11:44:48.613 回答
0

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

于 2018-03-30T23:28:09.263 回答