【问题标题】:Create an uninheriated copy of Datatable in C#在 C# 中创建 Datatable 的非继承副本
【发布时间】:2015-03-24 09:36:39
【问题描述】:

我需要将数据表(在数据集中)复制到独立的数据表中。我的目的是保存数据表的原始独立副本,以便在我想要的任何时候将其恢复到数据集。 我使用了这个代码:copiedDataTable = frm.DataSet.Tables["myoriginaldatatable"].Copy();,但它的工作原理与 Clone() 命令一样,并创建 originaldatatable 的结构,但行是空的,而 originaldatatable 的行在我跟踪时不是空的。

在另一次尝试中,我使用了以下代码:

copiedDataTable = frmMainForm.DataSet.Tables["originalDataTable"];

这个命令可以很好地复制原始数据表。但是当我从数据集中清除原始数据表以恢复复制的数据表时,复制的数据表也被清除并且行变为空。(通过此代码恢复:)

frmMainForm.DataSet.Tables["originalDataTable"].Clear();
                frmMainForm.DataSet.Tables.Remove("originalDataTable");
                frmMainForm.projectDataSet.Tables.Add(copiedDataTable);

如何制作独立副本?

【问题讨论】:

  • 根据msdn "复制创建一个新的数据表,其结构和数据与原始数据表相同。要将结构复制到新的数据表,但不复制数据,请使用克隆。”
  • 我也需要数据,但 copy() 命令不会将行数据复制到新表中。
  • 尝试先调用frmMainForm.DataSet.Tables["originalDataTable"].AcceptChanges()方法,然后复制表。如果是通过代码手动插入的行可能不被接受。
  • 不要通过初始化直接恢复原表。 .net 是通过 HashCode 而不是通过变量名或其键来处理对象。因此,您应该在循环中一一更新行和单元格值,而不是整个数据表。

标签: c# datatable copy dataset


【解决方案1】:

没有Copy() 方法也会复制数据。

根据msdn “复制创建一个新的数据表,其结构和数据与原始数据表相同。要将结构复制到新的数据表,但不复制数据,请使用克隆。”

当您在数据表中手动插入行时,新插入的行处于新行状态。因此,不能从这种行返回值。即使您更新 DataTable 单元格中的任何值,该单元格值的状态也是已编辑。如果不接受更改,您将无法从数据表中返回更新后的值。

例如,如果您更新了任何值,例如

dt.Rows[0]["MyCell"] = "MyValue"; //before that the value was "Old Value"

现在,如果我尝试从该单元格中获取该值,那么它将返回旧值或 null 如果没有。

string myValue = dt.Rows[0]["MyCell"];

要结束初始化,你必须在更新值后调用数据表的AcceptChanges()方法。

dt.Rows[0]["MyCell"] = "MyValue";
dt.AcceptChanges();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-18
    • 2021-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-28
    • 1970-01-01
    相关资源
    最近更新 更多