Нарушение параллелизма: UpdateCommand повлияло на 0 ожидаемых записей 1

Я новичок в c# и пытаюсь привязать datagridview к базе данных mssql в visual studio 2010. Привязки данных в порядке, и все, кажется, работает. За исключением нескольких странных ошибок:

Я получаю ошибку в этой теме после: обновление одной и той же строки 2 раза, удаление новой вставленной строки, после обновления строки, когда другая строка была удалена (слово изменяется на DeleteCommand)

ни одно из решений, которые я нашел в Google, не работает для меня. Надеюсь, кто-то может мне помочь. Вот те код:

    private void fillDatagrid()
        {
            //fill datagrid ADO.NET
            conn = new SqlConnection(TestApp.Properties.Settings.Default.TestdatabaseConnectionString);
            cmd = conn.CreateCommand();
            conn.Open();
            cmd.CommandText = "SelectFrom";
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.Add("@table", SqlDbType.NVarChar, 50).Value = "Countries";
            cmd.Parameters.Add("@filters", SqlDbType.NVarChar, 300).Value = "";

            adapt = new SqlDataAdapter(cmd);
            dt = new DataTable();
            adapt.Fill(dt);
            dt.TableName = "Countries";

            conn.Close();

            BindingSource src = new BindingSource();
            src.DataSource = dt;
            dt.RowChanged += new DataRowChangeEventHandler(dt_RowChanged);

            dgDatabaseGrid.DataSource = src;
            dgDatabaseGrid.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCells);
            //dgDatabaseGrid.RowValidating += new DataGridViewCellCancelEventHandler(dgDatabaseGrid_RowValidating);

            //disable columns:
            dgDatabaseGrid.Columns[0].Visible = false;
            dgDatabaseGrid.Columns["date_insert"].Visible = false;
            dgDatabaseGrid.Columns["user_insert"].Visible = false;
            dgDatabaseGrid.Columns["date_change"].Visible = false;
            dgDatabaseGrid.Columns["user_change"].Visible = false;
            dgDatabaseGrid.Columns["deleted"].Visible = false;

            //auto size last column
            dgDatabaseGrid.Columns["remarks"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;


            SqlCommandBuilder cb = new SqlCommandBuilder(adapt);
        }

        void dt_RowChanged(object sender, DataRowChangeEventArgs e)
        {
            try
            {
                adapt.Update(dt);
            }
            catch (SqlException ex)
            {
                Debug.WriteLine(ex.Message);
            }
        }

private void dgDatabaseGrid_UserDeletingRow(object sender, DataGridViewRowCancelEventArgs e)
        {
            if (!e.Row.IsNewRow)
            {


                DialogResult response = MessageBox.Show("Are you sure?", "Delete row?",
                                     MessageBoxButtons.YesNo,
                                     MessageBoxIcon.Question,
                                     MessageBoxDefaultButton.Button2);

                if (response == DialogResult.Yes)
                {

                    //ipv delete --> deleted=1
                    conn.Open();
                    cmd = conn.CreateCommand();
                    cmd.CommandType = CommandType.StoredProcedure;
                    cmd.CommandText = "DeleteFrom";
                    cmd.Parameters.Add("@table", SqlDbType.NVarChar, 50).Value = "Countries";
                    cmd.Parameters.Add("@id", SqlDbType.Int).Value = e.Row.Cells[0].Value;
                    cmd.ExecuteNonQuery();
                    conn.Close();


                    //delete from datagrid:
                    dt.Rows[dgDatabaseGrid.SelectedCells[0].RowIndex].Delete();

                }

                //always cancel!
                e.Cancel = true;

            }
        }

5 ответов


после обновления той же строки 2 раза

есть ли столбец Timestamp (или любой другой столбец, который изменяется/заполняется на сервере БД)?

ваша проблема может возникнуть, когда строка в памяти отличается от того, что находится в БД. И поскольку вы используете SP для SelectCmd, там (вероятно) нет обновления после обновления.

после удаления новой вставленной строки

аналогично, вызвано не получение нового идентификатора после вставки

после обновления строки, когда другая строка была удалена (слово изменяется на DeleteCommand)

совершенно непонятно.
Но почему вы удаляете строки "вручную", а не оставляете их для адаптации.Update() ? И вы уверены, что не оба метода выполняются?


Я знаю, что уже очень поздно, но, может быть, это кому-то поможет.

внесены следующие изменения в ваш код:

try
{
    adapt.Update(dt);

поместите эти строки здесь и используйте переменную

    Me.yourTableAdapter.Update(Me.yourDataSet.yourTable)
    Me.yourDataSet.youTable.AcceptChanges()
    Me.yourTableAdapter.Fill(Me.yourDataSet.yourTable)

это сработало как шарм для меня надеюсь, что это сработает для вас.

}
catch (SqlException ex)
{
    Debug.WriteLine(ex.Message);
}

я преследовал эту ошибку в своем приложении в течение нескольких недель! Я, наконец, нашел свою проблему.

то, что я нашел в своем приложении...

у меня много textboxes, comboboxes, etc. связанный с привязками данных. Некоторые из этих полей обновляются из комбинаций других полей. Все это отлично работает с одним исключением

если одно из вычисляемых полей будет пересчитано после вас EndEdit и перед тобой!--3-->, это приведет к dbconcurrency нарушение.

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

кстати, это один MDF, расположенный на компьютере пользователей, поэтому никто другой не имеет доступа к нему, чтобы изменить его во время обновления. Один пользователь-одно обновление. Мой код был "другой" пользователь.

надеюсь, что это может помочь кому-то другому в правильном направлении для их применения.


Если я могу добавить свои пять копеек.

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

этой Recalc бросил адаптера.

Я должен был поставить SqlCommandBuilder.ConflictOption = ConflictOption.OveriteChanges чтобы обойти эту проблему.

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


простой ответ:

Это просто означает, что если вы пытаетесь обновить строку, которая больше не существует в базе данных.

более подробную информацию можно найти здесь: http://blogs.msdn.com/b/spike/archive/2010/04/07/concurrency-violation-the-updatecommand-affected-0-of-the-expected-1-records.aspx