DBConcurrencyException в базе данных SQL - PullRequest
0 голосов
/ 18 мая 2011

Он все,

Недавно я начал проект, который требует много данных.Так много на самом деле это не может быть сохранено в оперативной памяти.Я искал решения этой проблемы и выбрал для использования базы данных SQL.Я нашел учебник, объясняющий, как они работают, и воссоздал его сам.Он гарантирует, что ваша физическая база данных и виртуальный набор данных будут синхронизированы, используя dataAdapter для обновления базы данных;

(FYI учебник можно найти здесь: http://www.homeandlearn.co.uk/csharp/csharp_s12p1.html);

Однако при расширении учебникая столкнулся с ошибкой, которую я не могу объяснить, а именно: DBConcurrencyException.

Когда я запускаю программу, все функции работают, я могу добавить строку и удалить строку. Но когда я пытаюсь сделать оба в одном и том же выполнении (порядок= добавить, затем удалить) появляется ошибка. Описывает, что DeleteCommand затронул ноль из одной ожидаемой записи.

Ниже приведены фрагменты кода, которые я использовал:

Инициализация:

private void Form1_Load(object sender, EventArgs e)
        {
            con = new SqlConnection();
            ds1 = new DataSet();

            con.ConnectionString = "Data Source=.\\SQLEXPRESS;AttachDbFilename=C:\\<Private>\\MyWorkers.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True";

            con.Open();

            string sql = "SELECT * From tblWorkers";
            da = new SqlDataAdapter(sql, con);

            da.Fill(ds1, "Workers");
            NavigateRecords();

            MaxRows = ds1.Tables["Workers"].Rows.Count;
            updateIndicator();

            con.Close();
            //con.Dispose();
        }

(Примечание: я закомментировал каталог по соображениям конфиденциальности);

Добавление строки выполняется следующим образом:

private void btnSave_Click(object sender, EventArgs e)
        {
            SqlCommandBuilder cb = new SqlCommandBuilder(da);

            DataRow dRow = ds1.Tables["Workers"].NewRow();

            dRow[1] = textBox1.Text;
            dRow[2] = textBox2.Text;
            dRow[3] = textBox3.Text;

            ds1.Tables["Workers"].Rows.Add(dRow);

            MaxRows = MaxRows + 1;
            inc = MaxRows - 1;

            da.Update(ds1, "Workers");

            MessageBox.Show("Entry Added");
        }

При удалении строки этокод выполняется:

private void btnDelete_Click(object sender, EventArgs e)
        {
            SqlCommandBuilder cb = new SqlCommandBuilder(da);

            ds1.Tables["Workers"].Rows[inc].Delete();
            MaxRows--;
            inc = 0;
            NavigateRecords();

            da.Update(ds1, "Workers");

            MessageBox.Show("Record Deleted");
        }

Метод NavigateRecord () и метод setIndicator () не имеют отношения к этому вопросу, поскольку они являются элементами графического интерфейса пользователя.

Спасибо запродвинуть всех!

1 Ответ

0 голосов
/ 26 сентября 2014

Я наткнулся на это вопрос , когда искал способ запретить SQL Server блокировать всю запись (вместо этого я хочу, чтобы он блокировался по значению поля / столбца), и заметил, что ответа не дано. так что вот, если кто-то еще столкнется с этой проблемой:

ОП на самом деле не задавал вопрос, а только указал, в чем проблема; Итак, вот ответ на вопрос, который не задавался «Как предотвратить нарушения параллелизма в базе данных?»:

Нарушения параллелизма в базе данных (в данном случае) можно предотвратить, приняв решение о том, какие данные попадают в базу данных. Большинство людей выбирают подход «последний в выигрыше». Таким образом, при обработке операций с помощью TableAdapter поместите обновление в Try / Catch и во время Catch for DBConcurrencyException просто убедитесь, что вы выполняете быстрое заполнение, затем изменяете то, что предполагалось изменить, а затем выполняете обновление. Работает каждый раз.

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