2

目前的情况是有一个数据绑定数据网格视图,许多人每天都需要同时对其进行更改。网格必须能够保存和更新,但它不能正常工作,因为它非常活跃。

这是场景:

  1. 3人同时打开网格表格。
  2. 他们对 3 行不同的数据进行更改。
  3. 第 1 个人保存更改并成功。
  4. 人员 2 保存更改并成功,但人员 1 的更改现在已消失,因为人员 2 的网格未与人员 1 刚刚提交的数据同步。
  5. 第 3 个人保存更改并清除第 1 个人和第 2 个人所做的任何事情,因为第 3 个人的数据网格视图未与更新的数据同步。

我首先尝试了这种方法:

    private MySqlDataAdapter da;
    private MySqlConnection conn;
    BindingSource bs = new BindingSource();
    DataSet ds = null;
    string qry;
    string ConnString = System.Configuration.ConfigurationManager.AppSettings["ConnectionString"];

    // THE LOAD METHOD
    private void LoadDataToGrid(string srcTable, string query)
    {
        conn = new MySqlConnection(ConnString);
        // ADD ANY QUERY
        qry = query;
        da = new MySqlDataAdapter(qry, conn);
        conn.Open();
        ds = new DataSet();
        MySqlCommandBuilder cb = new MySqlCommandBuilder(da);

        // USE TABLE NAME
        da.Fill(ds, srcTable);
        //USE TABLE NAME
        bs.DataSource = ds.Tables[srcTable];
        dataGridView1.DataSource = bs;

        // CUSTOMIZE GRID
        txtRows.Text = dataGridView1.Rows.Count.ToString();
        dataGridView1.AutoResizeColumns();
        dataGridView1.AllowUserToDeleteRows = false;
    }

    // THE SAVE METHOD
    private void SaveDataFromGrid(string srcTable)
    {
        // USE TABLE NAME
        DataTable dt = ds.Tables[srcTable];
        this.dataGridView1.BindingContext[dt].EndCurrentEdit();
        this.da.Update(dt);

        txtRows.Text = dataGridView1.Rows.Count.ToString();
    }

由于上述原因,这对我来说并不奏效。只是没有正确保存数据。

这是我的第二个想法,但仍然存在上述问题:

   // Load event
   dataGridView1.DataSource = context.TableName;

   // btnSave_click Event
   connection.open();

       // loop through cells in current row and apply changes by id

   context.tableName.Attach(DataFromGrid);
   context.ObjectStateManager.ChangeObjectState(DataFromGrid, System.Data.EntityState.Modified);
   context.savechanges();

基本上,我该如何解决这个断开连接的问题?以前有人遇到过这个问题吗?

4

1 回答 1

0

这个问题可能比一个代码片段要解决的更复杂。在开始实施之前,您似乎有几件事要先解决;

首先; 每个人的更改实际上是否必须提交整个网格?根据您的方案,每个人都会更改不同的数据行。修改您的代码以仅将更改提交到已修改的行将大大减少您的冲突场景。

其次,无论冲突是发生在一行还是多行,您都需要决定如何管理冲突(您没有注意到预期会发生什么 - 例如;数据库获胜,用户的选择等)。

EF 实现了乐观并发模式(无数据库锁),但是默认情况下,它只会在您提交本地更改时选择覆盖数据库更改。您需要修改 EF 配置以设置 ConcurrenyMode=Fixed 以便在提交行之前没有“获得最新”时它不会自动覆盖更改。

有关 EF 如何处理并发的更多信息,请参见此处:http: //msdn.microsoft.com/en-us/library/bb738618.aspx

修改 EF 配置后,当检测到冲突时,您将开始收到异常,您需要通过刷新数据库中的数据(使用本地更改)或刷新本地数据(使用数据库更改)来处理)。

于 2012-05-24T22:40:09.893 回答