C# 我的数据网格&x27;从网格';s绑定的数据集。有解决办法吗?
我正在使用Xceed的Datagrid,它绑定到一个数据集。我想在调用datagrid的RowEditEnd时更新数据库。问题是,为了避免更新时并发冲突,我必须在更新后清除数据集并重新填充,如下所示:C# 我的数据网格&x27;从网格';s绑定的数据集。有解决办法吗?,c#,ado.net,datagrid,concurrency,dataset,C#,Ado.net,Datagrid,Concurrency,Dataset,我正在使用Xceed的Datagrid,它绑定到一个数据集。我想在调用datagrid的RowEditEnd时更新数据库。问题是,为了避免更新时并发冲突,我必须在更新后清除数据集并重新填充,如下所示: public void UpdateDatabaseFromDataSet() { adapter.Update(exampleDataSet); exampleDataSet.Clear(); adapter.Fill(exampleDataSet); } 我想我必须这
public void UpdateDatabaseFromDataSet()
{
adapter.Update(exampleDataSet);
exampleDataSet.Clear();
adapter.Fill(exampleDataSet);
}
我想我必须这样做,因为我的数据集的主自动增量列“ID”与数据库生成的值不匹配。当我清除数据集时,它会清除datagrid及其选定的单元格。这非常烦人,因为如果编辑单元格并按enter键或方向键,单元格和数据库将正常更新,但您的选择将重置,而不是导航到下一行/单元格。这使得手工输入数据非常麻烦
以下是创建数据集的方法:
public void InitDataSet(int tableid)
{
cmd = new SQLiteCommand("SELECT * FROM table_" + tableid, con);
adapter = new SQLiteDataAdapter(cmd);
cb = new SQLiteCommandBuilder(adapter);
try
{
exampleDataSet = new DataSet();
adapter.Fill(exampleDataSet);
prodDataSet.Tables[0].Columns[0].AutoIncrementSeed = -1;
prodDataSet.Tables[0].Columns[0].AutoIncrementStep = -1;
currenttableID = tableid;
}
catch (ApplicationException ex)
{
MessageBox.Show("Encountered an error.", "Error: " + ex.ToString());
}
}
请注意,我已尝试将表autoincrementseed和autoincrementsteps设置为-1,但如果不重新填充数据集,仍然会出现并发冲突
如果我不清除并重新填充数据集,我真的希望我的datagrid能够像它那样工作。是否有任何方法可以避免我遇到的并发冲突?我走错方向了吗
谢谢你的帮助。
-史蒂文我并不完全理解这个问题,但我也许能给你一些东西
当您不清除数据集并调用“fill”时,它将尝试将数据库中的记录与现有记录“合并”。我想,清除会迫使网格刷新。。丢失所选行 与
Adapter.FillLoadOption=LoadOption.PreserveChanges(或其他)
您可以影响数据库中已更改的记录与数据集合并的方式。
现在还有一个问题,那就是在插入时确定新的autoinc值。您可以捕获适配器。行更新
void Adapter_RowUpdated(object sender, SqlRowUpdatedEventArgs e)
{
if (e.StatementType==StatementType.Insert)
{
Select last autoinc value with @@Identity
e.Row["ID"] = last autoinc value
}
}
因此:
- 不清除数据表
- 捕获更新的行并获取数据库中最新的autoinc值,将其放入新行
- Evt。调用fill查看其他用户是否进行了更改
void adapter_RowUpdated(object sender, System.Data.Common.RowUpdatedEventArgs e)
{
if (e.StatementType == StatementType.Insert)
{
SQLiteCommand cmdNewID = new SQLiteCommand("SELECT last_insert_rowid()", con);
e.Row["RowID"] = cmdNewID.ExecuteScalar();
}
}
是的,我很抱歉这个问题不太清楚。非常感谢你的建议,看来它们可以解决我的问题。下周我到家后,我会试试你的建议,告诉你进展如何。再次感谢。我接受了你的回答,因为你给我指出了正确的方向。非常感谢你的帮助,朱利安。我发布了下面另一个答案中使用的实际代码。再次感谢!
void adapter_RowUpdated(object sender, System.Data.Common.RowUpdatedEventArgs e)
{
if (e.StatementType == StatementType.Insert)
{
SQLiteCommand cmdNewID = new SQLiteCommand("SELECT last_insert_rowid()", con);
e.Row["RowID"] = cmdNewID.ExecuteScalar();
}
}