在更新到数据库之前编辑DataTable中的行

时间:2014-04-15 15:17:55

标签: c# sql .net datagridview datatable

情况就是这样:

我有一个链接到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()中添加的信息没有得救。

2 个答案:

答案 0 :(得分:1)

我会自己回答,但我不能确定这是否有效,因为项目有变化,组件不再成为其中的一部分。话虽这么说,我认为这是完成我想要做的正确方法,基于与其他组件类似的用例。

错误出现在TableAdapter的Update方法中用作参数的对象中,因为应该使用正在进行更改的DataTable。也就是说,使用

this.tableAdapterManager.UpdateAll(this.ExampleDataSet)

它尝试根据DataSet的行当前状态编写更改,但尚未将更改提交给它。正确的方法应该是:

this.exampleTableTableAdapter.Update(createdRows)

现在我明白这就是brinky所指出的,但是在我无法在代码中看到它的那一刻却没有能够修复它。

答案 1 :(得分:0)

我没有看到您使用修改后的数据表数据更新实际数据表的位置 - 您正在创建临时表,并修改其中的数据,但是它不用于在任何地方修改实际数据