DataTable 已经属于另一个 DataSet

Posted

技术标签:

【中文标题】DataTable 已经属于另一个 DataSet【英文标题】:DataTable already belongs to another DataSet 【发布时间】:2012-02-08 11:53:23 【问题描述】:

将一个数据表从一个数据集添加到另一个数据表时发生此错误 ."。"

dsformulaValues.Tables.Add(m_DataAccess.GetFormulaValues
(dv.ToTable.DefaultView.ToTable(False, strSelectedCols)).Tables(0))

【问题讨论】:

【参考方案1】:

就像其他回复指出的那样,您看到的错误是因为您尝试添加到 DataSet 的 DataTable 已经是不同 DataSet 的一部分。

一种解决方案是Copy DataTable 并将副本分配给另一个 DataSet。

dtCopy = dataTable.Copy()
ds.Tables.Add(dtCopy)

复制的DataTable将具有复制的DataTable的结构和数据。

如果您只想要 DataTable 的结构,请改为调用 Clone。

dtCopy = dataTable.Clone()

【讨论】:

你知道为什么会这样吗?含义例如列表 myl = 新列表();然后我添加了 3 个项目,我这样做了 myl[0] = myl[1] 并且效果很好。我已经将 myl[1] 添加到列表中。如果表已经属于数据集,则问题在 Datatable 上更为通用,即为什么以及如何进行此检查 复制有很多开销...请参阅下面的 Nathaniel Layton 的答案以获得更好的解决方案。 这可行,但它不应该是公认的答案......请参阅 Nathaniel Layton 的答案。【参考方案2】:

接受的答案不是很好。克隆应该永远是最后的选择。

这是一种解决问题的方法,不会产生克隆开销。

        DataSet ds = GetData1();

        DataSet ds2 = GetData2();

        //Assuming you know you've got good data

            DataTable dt = ds2.Tables[0];
            ds2.Tables.Remove(dt);
            dt.TableName = "PortedTable";//you may need to change the table name to prevent conflicts
            ds.Tables.Add(dt);

【讨论】:

@Layton 我可以知道Clone 有什么问题吗? 这应该是公认的答案...复制有很多开销。 这就像剪切和粘贴。您将其从一个 DataSet 中删除,然后将其添加到另一个。有没有一种方法可以在不克隆的情况下在两个数据集中保留同一张表?【参考方案3】:

尝试调用这个方法:

DataTable dt = dv.ToTable.DefaultView.ToTable(False, strSelectedCols)).Tables(0).Clone()

这将创建DataTable 的副本并将其分配给目标DataSet

ds.Tables.Add(dt)

【讨论】:

谢谢阿巴斯我知道了:) 克隆将只复制结构。 .Copy() 将复制模式和数据【参考方案4】:

我猜这意味着 DataTable 属于另一个 DataSet...

您可以将 DataTable 序列化为 XML,然后将其反序列化为您的目标 DataSet。

【讨论】:

我只是将一个数据集的一个数据表添加到另一个数据集。为此我们需要使用序列化? 一个数据表不能驻留在两个数据集中。也许您可以将其从第一个中删除并将其添加到第二个中。我从未尝试过。 dv.ToTable.DefaultView.ToTable(False, strSelectedCols)).Tables(0).Clone()) 为我工作 感谢您的回复【参考方案5】:

我认为你应该创建一个新的 DataTable 并将结构和数据导入新的。

【讨论】:

【参考方案6】:

尝试使用DataTable.Copy() 方法复制表,以防它不是类型化的DataSet。此方法创建同一个表的新实例,因此它不属于任何 DataSet:

dim newTable as DataTable = oldTable.Copy() 将 dv 调暗为 DataView = newTable.DefaultView

dsformulaValues.Tables.Add(m_DataAccess.GetFormulaValues(dv.ToTable.DefaultView.ToTable(False, strSelectedCols)).Tables(0))

【讨论】:

【参考方案7】:

我遇到了同样的问题,我使用Remove 解决了它。在我看来,您的代码可能是这样的:

dsformulaValues.Tables.Add(m_DataAccess.GetFormulaValues
(dv.ToTable.DefaultView.ToTable(False, strSelectedCols)).Tables(0))

dsformulaValues.Tables.Remove(//I'm not sure to understand your code, so read this code line as only an input for your stuff. Please, consider my code below for more understanding.

我的工作代码是这样的:

DataTable myTable = new DataTable();

private void Save()

    DataSet myDataSet = new DataSet();
    myDataSet.Tables.Add(myTable);
    myDataSet.Tables.Remove(myTable);//This works
    myDataSet.WriteXml("myTable.xml");


private void buttonSave_Click(object sender, EventArgs e)
        
          Save();
        

每次我点击按钮buttonSave,都会出现“DataTable已经属于另一个DataSet”的消息。写了myDataSet.Tables.Remove(myTable);//This works这行代码后,应用程序开始运行没有问题,现在我可以多次点击按钮,没有丢失 myTable 的值并且没有错误消息。

我希望这会有所帮助。

【讨论】:

抱歉,myDataSet.Tables.Remove(myTable);//This works 行代码(在我上面的代码中)必须在 myDataSet.WriteXml("myTable.xml"); 之后,我确认代码有效。【参考方案8】:

我找到了一个转身希望它可以帮助

_DataTable.TableName = _TableName
If _DataTable.DataSet IsNot Nothing Then
    _DataSet = _DataTable.DataSet
Else
    _DataSet = New DataSet
    _DataSet.Tables.Add(_DataTable)
End If

即使 _DataTable 是新的,但如果它引用先前加载的物理表,它就会变成继承先前配置的 DataTable。

【讨论】:

【参考方案9】:

简单的方法就是合并表格如下。

dsformulaValues.Merge(m_DataAccess.GetFormulaValues(dv.ToTable.DefaultView.ToTable(False, strSelectedCols)).Tables(0))

【讨论】:

【参考方案10】:

dtCopy = dataTable.Copy()

ds.Tables.Add(dtCopy)

我们可以优化如下代码:

ds.Tables.Add(dataTable.Copy());

【讨论】:

以上是关于DataTable 已经属于另一个 DataSet的主要内容,如果未能解决你的问题,请参考以下文章

将 DataTable 从一个 DataSet 复制到另一个

DataTable 'Table' 已经属于这个 DataSet - 在一个新的 DataSet 上?

DataSet.Merge - 将类型化的 DataSet/DataTable 合并到另一个 DataSet 并使用它

请问如何把DataGrid上的datasource转换成datatable或者dataset啊

C#两个DataTable拷贝问题:该行已经属于另一个表的解决方法

名为“ds”的 DataTable 已属于此 DataSet。