【发布时间】:2012-02-08 11:53:23
【问题描述】:
将一个数据表从一个数据集添加到另一个数据表时发生此错误 ."DataTable 已经属于另一个 DataSet。"
dsformulaValues.Tables.Add(m_DataAccess.GetFormulaValues
(dv.ToTable.DefaultView.ToTable(False, strSelectedCols)).Tables(0))
【问题讨论】:
将一个数据表从一个数据集添加到另一个数据表时发生此错误 ."DataTable 已经属于另一个 DataSet。"
dsformulaValues.Tables.Add(m_DataAccess.GetFormulaValues
(dv.ToTable.DefaultView.ToTable(False, strSelectedCols)).Tables(0))
【问题讨论】:
【讨论】:
接受的答案不是很好。克隆应该永远是最后的选择。
这是一种解决问题的方法,不会产生克隆开销。
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);
【讨论】:
Clone 有什么问题吗?
尝试调用这个方法:
DataTable dt = dv.ToTable.DefaultView.ToTable(False, strSelectedCols)).Tables(0).Clone()
这将创建DataTable 的副本并将其分配给目标DataSet:
ds.Tables.Add(dt)
【讨论】:
我猜这意味着 DataTable 属于另一个 DataSet...
您可以将 DataTable 序列化为 XML,然后将其反序列化为您的目标 DataSet。
【讨论】:
我认为你应该创建一个新的 DataTable 并将结构和数据导入新的。
【讨论】:
尝试使用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))
【讨论】:
我遇到了同样的问题,我使用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"); 之后,我确认代码有效。
我找到了一个转身希望它可以帮助
_DataTable.TableName = _TableName
If _DataTable.DataSet IsNot Nothing Then
_DataSet = _DataTable.DataSet
Else
_DataSet = New DataSet
_DataSet.Tables.Add(_DataTable)
End If
即使 _DataTable 是新的,但如果它引用先前加载的物理表,它就会变成继承先前配置的 DataTable。
【讨论】:
简单的方法就是合并表格如下。
dsformulaValues.Merge(m_DataAccess.GetFormulaValues(dv.ToTable.DefaultView.ToTable(False, strSelectedCols)).Tables(0))
【讨论】:
dtCopy = dataTable.Copy()
ds.Tables.Add(dtCopy)
我们可以优化如下代码:
ds.Tables.Add(dataTable.Copy());
【讨论】: