【问题标题】:Edit Row in DataTable before Update to Database在更新到数据库之前编辑 DataTable 中的行
【发布时间】: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() 中的添加信息不是正在被保存。

【问题讨论】:

    标签: c# sql .net datagridview datatable


    【解决方案1】:

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

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

    this.tableAdapterManager.UpdateAll(this.ExampleDataSet)
    

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

    this.exampleTableTableAdapter.Update(createdRows)
    

    现在我明白这是 brinky 所指出的,但当时我在代码中看不到它,因此无法修复它。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 我虽然想到了这一点,但是如果我在编辑后尝试将该行添加回数据表,我会收到一条错误消息,指出该行已经在表中。请帮忙,我知道我很困惑,解决方案就像一行代码。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-04-30
      • 2013-01-24
      • 1970-01-01
      • 2023-03-18
      • 1970-01-01
      • 2019-03-10
      • 1970-01-01
      相关资源
      最近更新 更多