Нарушение параллелизма: команда UpdateCommand затронула 0 из ожидаемых 1 записей - PullRequest
6 голосов
/ 02 августа 2010

Я новичок в c # и пытаюсь привязать представление данных к базе данных 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 ]

7 голосов
/ 01 января 2014

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

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

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);
}
1 голос
/ 11 ноября 2016

Я гоняюсь за этой ошибкой в ​​своем приложении уже несколько недель!Я наконец нашел свою проблему.

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

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

Если одно из вычисляемых полей будет пересчитано после вас EndEdit и до вас Update, это вызовет нарушение dbconcurrency.

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

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

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

1 голос
/ 02 августа 2010

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

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

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

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

Похоже, из-за не извлечения нового идентификатора после вставки

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

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

0 голосов
/ 08 декабря 2016

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

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

Этот Recalc бросил адаптер.чтобы обойти эту проблему.

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

0 голосов
/ 11 января 2016

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

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

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

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