引发DBConcurrencyException时保留其他行

时间:2018-07-02 11:04:05

标签: c# sql-server winforms concurrency

我制作了一个简单的应用程序,可以在DataGridView中显示数据库中的数据,用户可以添加行,删除行,更新值并保存更改。

现在,假设用户A修改了第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();
    }
}

0 个答案:

没有答案