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

3

実際のデータベースで一致しないレコードを削除しようとすると、同時実行例外が発生します。これは、データセットが追加直後に ID 列の値を取得しないため、ID 列を持つ新しく追加されたレコードで発生します。 これを修正するには、必要です

1 - SQL コマンドを実行してデータベースから ID 列の値を取得し、データ セット内のレコードをこの値で更新します。

または
2- 次の呼び出しにより、データベース データ テーブルの変更を受け入れることができます。

table.AcceptChanges();

次に、呼び出してデータテーブルを補充した直後

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

同時実行の例外は、変更された行が予想より少ないことを意味します。これは通常、更新/削除にwhere句があり、アクションの実行を妨げる場合に発生します。(これは通常、同時実行の仕組みです。whereを使用してLastUpdateDateが変更されていないことを確認し、読み取り操作と書き込み操作の間に誰も入っていないことを確認します)削除する場所は「id = @id」だけなので、問題が発生します。 DeleteCommandの実行時にIDがDBに存在しないことを確認する必要があります。

私はあなたのコードに2つの問題を見ることができます:

  1. 「テーブル」を変更に再利用せず、代わりに新しいDataTableを使用してください。
  2. 更新後にtable.AcceptChanges()を呼び出すと、削除されたエントリがDataTableから削除されます。

問題は、削除された行が保持されて再度削除されたか、エントリを削除する前にエントリを削除する他の操作が原因である可能性があります(後者の場合、同時実行例外を処理する必要があります)

于 2012-11-26T11:44:48.613 に答える