将一个数据表从一个数据集添加到另一个数据表时发生此错误 .“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);
尝试调用这个方法:
DataTable dt = dv.ToTable.DefaultView.ToTable(False, strSelectedCols)).Tables(0).Clone()
这将创建
DataTable
的副本并将其分配给目标 DataSet
:
ds.Tables.Add(dt)
我猜这意味着 DataTable 属于另一个 DataSet...
您可以将 DataTable 序列化为 XML,然后将其反序列化到目标 DataSet 中。
我认为你应该创建一个新的数据表并将结构和数据导入到新的数据表中。
尝试使用 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))
我遇到了同样的问题,我使用
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
并且没有错误消息。
我希望这能有所帮助。
我找到了一个转身希望它能有所帮助
_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());
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);