同时用户在数据绑定DataGridView中进行更改的问题

时间:2012-05-24 14:07:07

标签: c# winforms linq entity-framework datagridview

目前的情况是,存在数据绑定数据网格视图,许多人需要同时进行每日更改。网格必须能够保存和更新,但由于它非常活跃,因此无法正常工作。

以下是该方案:

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

        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();
    

    基本上,我该如何解决这个断线问题?有没有人以前有这个问题?

1 个答案:

答案 0 :(得分:0)

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

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

其次,无论冲突是在一行还是多行中发生,您都需要决定如何管理冲突(您没有注意到您希望发生的事情 - 例如;数据库获胜,用户选择,ett。)

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

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

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