Почему я получаю ошибку нарушения параллелизма? - PullRequest
0 голосов
/ 26 марта 2010

У меня есть MS Access db, сетка данных, отображающая элементы, два столбца с флажками, которые представляют столбцы Да / Нет в базе данных, и кнопки обновления / удаления.

Когда я пытаюсь удалить строку, чьи флажки не были изменены, строка удаляется очень хорошо, также, когда я изменяю значение флажка, нажимаю кнопку обновления и затем удаляю, строка тоже удаляется.

Однако, когда я пытаюсь удалить строку сразу после изменения ее значения флажка, я получаю ошибку исключения исключения параллелизма.

При изменении значения флажка код:

private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e)
    {

        if (dataGridView1.Columns[e.ColumnIndex].Name == "sales")
        {

            DataGridViewCheckBoxCell checkCell = (DataGridViewCheckBoxCell)dataGridView1.Rows[e.RowIndex].Cells["sales"];
            bool _pSale = (Boolean)checkCell.Value;

            string connstring = string.Format(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0}", Path.Combine(Directory.GetCurrentDirectory(), "MyDatabase01.accdb"));
            OleDbConnection conn = new OleDbConnection(connstring);
            conn.Open();

            string sqlqry = "UPDATE Items SET pSale = " + _pSale + " WHERE p_Name = '" + this._pName + "'";
            OleDbCommand upd = new OleDbCommand(sqlqry, conn);
            upd.ExecuteNonQuery();
            conn.Close();
            //dataGridView1.Invalidate();

        }
}

Код кнопки обновления:

public void Refreshdgv()
        {
            this.categoriesItemsBindingSource.EndEdit();
            this.itemsTableAdapter.Fill(myDatabase01DataSet.Items);
            this.dataGridView1.Refresh();
        }

Код кнопки удаления:

private void delBtn_Click(object sender, EventArgs e)
    {
            try
            {

                int cnt = dataGridView1.SelectedRows.Count;
                for (int i = 0; i < cnt; i++)
                {
                    if (this.dataGridView1.SelectedRows.Count > 0)
                    {
                        this.dataGridView1.Rows.RemoveAt(this.dataGridView1.SelectedRows[0].Index);
                    }
                }


                this.Validate();
                this.categoriesItemsBindingSource.EndEdit();
                this.itemsTableAdapter.Update(this.myDatabase01DataSet.Items);
                this.myDatabase01DataSet.AcceptChanges();

            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
    }

Чтобы решить эту проблему, я могу вызвать метод Refreshdgv () вместо dataGridView1.Invalidate (). Но я не хочу обновлять dgv для каждого щелчка флажка!

Ответы [ 2 ]

1 голос
/ 26 марта 2010

Команда удаления вашего DataSet, вероятно, проверяет исходные значения. Поскольку вы обновляете базу данных вручную в событии CellValueChanged, значения в вашей базе данных не будут совпадать с исходными значениями в вашем наборе данных. Если вы измените событие CellValueChanged, чтобы использовать команду обновления в вашем наборе данных, значения должны совпадать при вызове Delete.

В качестве альтернативы вы можете изменить команду удаления, чтобы использовать менее эксклюзивное предложение where (например, WHERE KeySegment0 = @keySegment0 AND KeySegment1 = @keySegment1 ...).

0 голосов
/ 28 марта 2017

Попробуйте проверить данные, затем обновите их. После этого очистите ваш набор данных и заполните его, чтобы он обновлял сетку данных при каждом внесенном вами изменении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...