Он все,
Недавно я начал проект, который требует много данных.Так много на самом деле это не может быть сохранено в оперативной памяти.Я искал решения этой проблемы и выбрал для использования базы данных 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 () не имеют отношения к этому вопросу, поскольку они являются элементами графического интерфейса пользователя.
Спасибо запродвинуть всех!