在更新到数据库之前编辑 DataTable 中的行
Posted
技术标签:
【中文标题】在更新到数据库之前编辑 DataTable 中的行【英文标题】:Edit Row in DataTable before Update to Database 【发布时间】:2014-05-30 01:18:54 【问题描述】:情况是这样的:
我有一个链接到 TableAdapter 的 DataGridView。由于 Table 的某些列对 DataGridView 隐藏,因此必须在将更改提交到数据库之前添加隐藏列的内容(其中一些是外键)。
我要做的是拦截添加的行,将数据添加到相关列,然后继续提交更改。代码如下:
var createdRows = (ExampleDataset.ExampleTableDataTable)this.ExampleDataset.ExampleTable.GetChanges(DataRowState.Added);
try
if(createdRows != null)
foreach(var row in createdRows)
row.ID_OTHER_TABLE = this.idOtherTable;
row.REF_OTHER_TABLE = this.refOtherTable;
this.exampleTableBindingSource.EndEdit();
this.tableAdapterManager.UpdateAll(this.ExampleDataSet);
this.ExampleDataSet.AcceptChanges();
catch(Exception ex)
MessageBox.Show("Error updating database: " + ex.Message);
通过在另一个视图中检查表并通过调试,我可以看到,正在捕获添加的行、正在编辑的字段、保存到数据库的行,但 foreach()
中的添加信息不是正在被保存。
【问题讨论】:
【参考方案1】:我会回答自己,但我不能确定这是否有效,因为项目发生了变化,组件不再是其中的一部分。话虽如此,我认为这是完成我想做的事情的正确方法,基于与其他组件的类似用例。
错误出现在 TableAdapter 的 Update 方法中用作参数的对象中,因为应该使用正在对其进行更改的 DataTable。也就是说,使用
this.tableAdapterManager.UpdateAll(this.ExampleDataSet)
它尝试根据 DataSet 的行当前状态写入更改,但更改尚未提交给它。正确的做法应该是:
this.exampleTableTableAdapter.Update(createdRows)
现在我明白这是 brinky 所指出的,但当时我在代码中看不到它,因此无法修复它。
【讨论】:
【参考方案2】:我没有看到您在哪里使用修改后的数据表数据更新实际数据表 - 您正在创建一个临时表并修改其中的数据,但它不用于在任何地方修改实际数据.
【讨论】:
我虽然想到了这一点,但是如果我在编辑后尝试将该行添加回数据表,我会收到一条错误消息,指出该行已经在表中。请帮忙,我知道我很困惑,解决方案就像一行代码。以上是关于在更新到数据库之前编辑 DataTable 中的行的主要内容,如果未能解决你的问题,请参考以下文章
c# 为啥我修改了datatable后,再更新数据库,只是在原来的表中的行往后加,却不是重新写?应该怎么改啊?
如何在PrimeFaces中找出DataTable是否处于行编辑状态?
可编辑的网格 ExtJS,如何在网格上编辑行后更新数据库中的行
锁定 DataSet 中的所有 DataTable 以执行安全更新