目前的情况是,存在数据绑定数据网格视图,许多人需要同时进行每日更改。网格必须能够保存和更新,但由于它非常活跃,因此无法正常工作。
以下是该方案:
我先尝试过这种方法:
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();
基本上,我该如何解决这个断线问题?有没有人以前有这个问题?
答案 0 :(得分:0)
这个问题可能比一个代码片段要解决的问题复杂得多。在您开始实施之前,您似乎首先需要解决几个问题;
首先;每个人的变化实际上是否必须提交整个网格?根据您的方案,每个人都会更改不同的数据行。修改代码以仅对已修改的行提交更改将大大减少您的冲突情况。
其次,无论冲突是在一行还是多行中发生,您都需要决定如何管理冲突(您没有注意到您希望发生的事情 - 例如;数据库获胜,用户选择,ett。)
EF实现了乐观并发模式(没有数据库锁),但默认情况下,它只会在您提交本地更改时选择覆盖数据库更改。您需要修改EF配置以设置ConcurrenyMode = Fixed,以便在提交行之前没有“最新”时它不会自动覆盖更改。
有关EF如何处理并发的更多信息,请参阅此处:http://msdn.microsoft.com/en-us/library/bb738618.aspx
修改EF配置后,通过刷新数据库中的数据(使用本地更改)或刷新本地数据,您将在检测到冲突时开始获取异常(您需要处理这些异常)数据库更改)。