DataTable 已属于另一个 DataSet

问题描述 投票:0回答:11

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

dsformulaValues.Tables.Add(m_DataAccess.GetFormulaValues
(dv.ToTable.DefaultView.ToTable(False, strSelectedCols)).Tables(0))
.net vb.net datatable
11个回答
100
投票

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

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

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

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

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

dtCopy = dataTable.Clone()

42
投票

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

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

        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
投票

尝试调用这个方法:

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

这将创建

DataTable
的副本并将其分配给目标
DataSet
:

ds.Tables.Add(dt)


0
投票

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

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


0
投票

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


0
投票

尝试使用 DataTable.Copy() 方法复制表,以防它不是类型化的 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))


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 已属于另一个数据集”。编写行代码后
myDataSet.Tables.Remove(myTable);//This works
应用程序开始运行,没有出现任何问题,现在我可以多次单击按钮,而不会丢失值
myTable
并且没有错误消息。

我希望这能有所帮助。


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就会继承以前的配置。


0
投票

最简单的方法就是合并表格,如下所示。

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


0
投票

dtCopy = dataTable.Copy()

ds.Tables.Add(dtCopy)

我们可以像这样优化代码:

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


0
投票
 DataSet ds = GetSpotQuery.PostOptimizedSpot(SelectedchannelId, SelectedDate, SU_selectedValues, User_ID);  DataSet dsConstraint = GetSpotQuery.ConstraintRules(SelectedchannelId, SelectedDate, User_ID);  //dsConstraint.Tables[0].TableName = "PostConstraintRules";

 DataTable[] dtArrays = new DataTable[ds.Tables.Count + dsConstraint.Tables.Count];

 ds.Tables.CopyTo(dtArrays, 0);  dsConstraint.Tables.CopyTo(dtArrays, ds.Tables.Count);

 dtArrays[0].TableName = "PostOptimizedSpot";  dtArrays[ds.Tables.Count].TableName = "ConstraintRules";

 ExportToExcel("OptimizedSpots", dtArrays);
© www.soinside.com 2019 - 2024. All rights reserved.