从数据集向另一个数据集添加一个数据表时发生此错误 msgstr“DataTable已经属于另一个DataSet。”
dsformulaValues.Tables.Add(m_DataAccess.GetFormulaValues
(dv.ToTable.DefaultView.ToTable(False, strSelectedCols)).Tables(0))
答案 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());