代码之家  ›  专栏  ›  技术社区  ›  John Calsbeek

在数据源上删除的行的DataAdapter.Fill()行为

  •  4
  • John Calsbeek  · 技术社区  · 16 年前

    我在用电话 DataSet DataTable / DataAdapter 在数据库和my model对象之间进行调解的体系结构,它们有自己的支持(它们不受DataRow支持)。我有一本书 数据适配器 具有 AcceptChangesDuringFill = False , AcceptChangesDuringUpdate = False FillLoadOption = OverwriteChanges . 以下是我对这个问题的理解 数据适配器 模型在这些条件下:

    DataAdapter.Update()

    • DataRowState.Added 将导致 InsertCommand
    • DataRowState.Modified 将导致 UpdateCommand 发射
    • DataRowState.Deleted DeleteCommand 发射

    DataAdapter.Fill()

    • 返回结果集中主键与 数据表 将用于更新该行,并且该行的状态将始终为 DataRowState.Modified , 即使返回的行与当前行相同
    • 返回结果集中主键与任何现有行不对应的任何行将用于创建新行,并且该行的状态将变为 DataRowState.Added
    • 房间里有任何一排吗 与返回结果集中的行不对应的将保留在 DataRowState.Unchanged

    假设我对这个心智模型的理解是正确的,假设我想使用 Fill() 注意数据源中已删除的行。另外,假设 SelectCommand 不要退回整张桌子。我猜我有两个选择:

    • 查找应用程序应该更新的所有行 填充() 但他们仍然 DataRowState。未更改 (取决于我上面未经检验的斜体假设)。这些行已在数据源中删除。
    • 数据表 填充() ; 任何不再显示的行都已在数据源中删除。这就失去了两者之间的区别 DataRowState.Added DataRowState.Modified 第一种方法保留了这一点。

    所以,我的问题是:

    • 这是我上面的模型 数据适配器 正确,以我在顶部记录的属性值为准?
    • DataRowState.Modified 即使行是相同的;这是一个安全的假设吗?
    • 我这样做完全错了吗?
    2 回复  |  直到 16 年前
        1
  •  1
  •   John Calsbeek    16 年前

    如果 SelectCommand 与中已存在的行完全相同 DataTable ,该行仍标记为 DataRowState.Unchanged . 因此,正确的步骤是从 数据表 打电话之前 Fill() ,并通过比较新的 DataRowState.Added 将行添加到前一行列表中。

        2
  •  1
  •   Brock Adams    14 年前

    .Clear 自从 DataTable 已绑定到用户界面列表,并且 清楚的 .Fill 导致列表丢失用户的当前选择。因此,我实现了一个(丑陋的)解决方案,它基本上包括

    1. 跑步 填满

        For Each drow As DataRow In dset.Tables(0).Rows
            drow.Item("myField") = -1
        Next
    
        myDataAdapter.Fill(dset)
    
        Dim drowsRemove = (From drow In dset.Tables(0).AsEnumerable() _
                           Where drow.Field(Of Integer)("myField") = -1).ToList()
        For Each drow In drowsRemove
            dset.Tables(0).Rows.Remove(drow)
        Next
    

    如有任何关于更优雅解决方案的建议,我们将不胜感激。

    推荐文章