Я сделал простое приложение, которое отображает данные из базы данных в DataGridView, пользователи могут добавлять строки, удалять строки, обновлять значения и сохранять изменения.
Теперь, скажем, пользователь А изменяет значение в строке 8 и сохраняет. Пользователь B добавляет 50 строк и хочет также изменить ячейку в строке 8. Когда пользователь B сохраняет, возникает DBConcurrencyException, и вся его работа теряется.
Учитывая то, как люди будут использовать это приложение, такого сценария не должно быть, но шанс все еще мал.
Можно ли сохранить добавленные строки при возникновении исключения DBConcurrencyException? Или я должен просто сказать пользователям сохранять как можно чаще?
Вот соответствующий код:
private BindingSource bindingSource = null;
private SqlCommandBuilder commandBuilder = null;
string conStringLocal = "xxxxxxxxxxx";
SqlCommand command;
SqlDataAdapter dataAdapter;
DataTable dataTable = new DataTable();
public Form1()
{
InitializeComponent();
DataBind();
}
private void DataBind()
{
dataGridViewCND.DataSource = null;
dataTable.Clear();
string query = "SELECT * FROM myTable";
SqlConnection con = new SqlConnection(conStringLocal);
try
{
con.Open();
command = con.CreateCommand();
command.CommandText = query;
dataAdapter = new SqlDataAdapter(query, con);
commandBuilder = new SqlCommandBuilder(dataAdapter);
dataAdapter.Fill(dataTable);
bindingSource = new BindingSource { DataSource = dataTable };
dataGridViewCND.DataSource = bindingSource;
this.dataGridViewCND.Columns["id"].Visible = false;
this.dataGridViewCND.Sort(this.dataGridViewCND.Columns["Date"], ListSortDirection.Ascending);
}
catch (Exception ex)
{
// GENERIC ERROR MESSAGE
}
}
private void buttonSave_Click(object sender, EventArgs e)
{
try
{
dataGridViewCND.EndEdit();
dataAdapter.Update(dataTable);
DataBind();
// UPDATE SUCCESS MESSAGE
}
catch(DBConcurrencyException ex)
{
// CONCURRENCY ERROR MESSAGE
DataBind();
}
catch (Exception ex)
{
// GENERIC ERROR MESSAGE
DataBind();
}
}