Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net DataTable已属于另一个数据集_.net_Vb.net_Datatable - Fatal编程技术网

.net DataTable已属于另一个数据集

.net DataTable已属于另一个数据集,.net,vb.net,datatable,.net,Vb.net,Datatable,将一个数据表从一个数据集添加到另一个数据表时发生此错误 “DataTable已属于另一个数据集。” 我猜这意味着DataTable属于另一个数据集 您可以将数据表序列化为XML,然后将其反序列化到目标数据集中。我认为您应该创建一个新的数据表,并将结构和数据导入新的数据表。尝试调用此方法: DataTable dt=dv.ToTable.DefaultView.ToTable(False,strSelectedCols)).Tables(0.Clone() 这将创建数据表的副本,并将其分配给目标数

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


我猜这意味着DataTable属于另一个数据集


您可以将数据表序列化为XML,然后将其反序列化到目标数据集中。

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

尝试调用此方法:


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

这将创建
数据表的副本
,并将其分配给目标
数据集


ds.Tables.Add(dt)

与其他响应指出的一样,您看到的错误是因为您尝试添加到数据集的DataTable已经是另一个数据集的一部分

一种解决方案是创建DataTable并将副本分配给另一个数据集

dsformulaValues.Tables.Add(m_DataAccess.GetFormulaValues
(dv.ToTable.DefaultView.ToTable(False, strSelectedCols)).Tables(0))
dtCopy = dataTable.Copy()
ds.Tables.Add(dtCopy)
复制的数据表将具有复制的数据表的结构和数据

如果只需要DataTable的结构,请调用


尝试使用方法复制该表,以防它不是类型化数据集。此方法创建同一表的新实例,使其不属于任何数据集:

dim newTable as DataTable=oldTable.Copy() dim dv as DataView=newTable.DefaultView


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

我也遇到了同样的问题,我使用
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)后//这是可行的
应用程序开始运行时没有出现问题,现在我可以多次单击该按钮,而不会丢失
myTable
的值,也不会显示错误消息


我希望这能有所帮助。

我找到了一个转机,我希望它能有所帮助

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

不知何故,即使数据表是新的,但如果它引用以前加载的物理表,它也会成为继承以前配置的数据表。

简单的方法就是如下合并该表


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

我只是将一个数据集的一个数据表添加到另一个数据集。为此,我们需要使用序列化?一个数据表不能驻留在两个数据集中。也许您可以将其从第一个数据集中删除,然后添加到第二个数据集中。我从未尝试过。dv.ToTable.DefaultView.ToTable(False,strSelectedCols)).Tables(0)。Clone())是为我工作的谢谢你的回复Tanks abbas我得到了:)克隆将只复制结构..copy()将复制架构和数据你知道为什么会这样吗?意思是,例如,List myl=new List();然后我添加3项,我这样做myl[0]=myl[1],效果很好。我已经添加了myl[1]这个问题在Datatable上更为普遍,即如果该表已经属于DatasetCopy,那么为什么以及如何执行此检查会有很大的开销…请参阅下面的Nathaniel Layton的答案以获得更好的解决方案。这是可行的,但不应该是公认的答案…请参阅Nathaniel Layton的答案。@Layton我可以知道
C有什么问题吗孤独的
?这应该是公认的答案…复制有很多开销。这就像剪切和粘贴一样。你从一个数据集中删除它,然后将它添加到另一个数据集中。有没有一种方法可以使两个数据集中的表保持相同而不进行克隆?对不起,
myDataSet.Tables.remove(myTable);//这很有效
行代码(在上面的代码中)必须在
myDataSet.WriteXml(“myTable.xml”);
I确认代码有效。
_DataTable.TableName = _TableName
If _DataTable.DataSet IsNot Nothing Then
    _DataSet = _DataTable.DataSet
Else
    _DataSet = New DataSet
    _DataSet.Tables.Add(_DataTable)
End If