在更新到数据库之前编辑 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 以执行安全更新

DT::datatable - 选择要删除的行并写入没有闪亮的 csv

C#中的DataTable怎么获取已删除行的信息