DataTable已经属于另一个DataSet

时间:2012-01-12 06:15:06

标签: .net vb.net datatable

从数据集向另一个数据集添加一个数据表时发生此错误 msgstr“DataTable已经属于另一个DataSet。”

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

10 个答案:

答案 0 :(得分:78)

与其他响应一样,您看到的错误是因为您尝试添加到DataSet的DataTable已经是不同DataSet的一部分。

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

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

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

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

dtCopy = dataTable.Clone()

答案 1 :(得分:31)

接受的答案并不是很好。克隆应始终是最后一种选择。

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

        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);

答案 2 :(得分:2)

尝试调用此方法:

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

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

ds.Tables.Add(dt)

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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

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

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

答案 6 :(得分:0)

我遇到了同样的问题,我使用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的值并且没有错误消息。

我希望这可以提供帮助。

答案 7 :(得分:0)

我发现转了一圈我希望它可以提供帮助

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

不管怎样,即使_DataTable是新的,但如果它引用了之前加载的物理表,那么DataTable就会继承先前的配置。

答案 8 :(得分:0)

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

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

答案 9 :(得分:0)

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

此解决方案也可以单行编写

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