2012-01-12 41 views
34

將數據集中的一個數據集添加到另一個數據集時發生此錯誤 「DataTable已屬於另一個DataSet」。DataTable已屬於另一個數據集

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

回答

70

像其他答覆指出,你所看到的錯誤是因爲你試圖添加到DataSet的DataTable已經是不同DataSet的一部分。

一種解決方案是Copy DataTable並將副本分配給其他DataSet。

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

複製的數據表將具有以下結構和所複製的數據表的數據。

如果您只需要DataTable的結構,請改爲調用Clone

dtCopy = dataTable.Clone() 
+0

你知道爲什麼會出現這種情況嗎?意義例如列表 myl =新列表();然後我添加3個項目,我做這個myl [0] = myl [1],這工作正常。我已經將myl [1]添加到列表中。問題是Datatable更通用的爲什麼以及如何檢查如果表已經屬於數據集 – Dhananjay 2012-04-26 05:18:40

+4

副本有很多開銷...請參閱Nathaniel Layton的答案以獲得更好的解決方案。 – Edyn 2013-09-13 20:28:38

0

我想這意味着將DataTable屬於另一個數據集...

可以serialze數據表到XML,然後反序列化到目標數據集。

+0

我只是增加一個數據集的數據表一個到另一個數據集。爲此,我們需要使用序列化? – kbvishnu 2012-01-12 06:17:50

+0

DataTable不能駐留在兩個DataSet中。也許你可以從第一個中刪除它並將其添加到第二個中。我從來沒有嘗試過。 – zmbq 2012-01-12 06:21:31

+0

dv.ToTable.DefaultView.ToTable(False,strSelectedCols))。Tables(0).Clone())爲我工作感謝您的回覆 – kbvishnu 2012-01-12 06:28:00

0

我想你應該創建一個新的DataTable並將結構和數據導入到新的DataTable中。

2

嘗試調用此方法:

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

這將創建DataTable的副本,並將其分配給目標DataSet

ds.Tables.Add(dt)

+0

謝謝阿巴斯我已經得到它:) – kbvishnu 2012-01-12 06:27:15

+1

克隆將只複製結構。 .Copy()將複製模式以及數據 – kbvishnu 2012-01-12 10:04:05

0

如果不是類型化數據集,請嘗試使用DataTable.Copy()方法複製表。這個方法創建了同桌的新實例,所以它不是要去屬於任何數據集:

暗淡newtable的作爲數據表= oldTable.Copy() 昏暗DV作爲數據視圖= newTable.DefaultView

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

27

接受的答案不是很好。克隆應始終是最後的選擇。

這是解決問題的一種方法,不會產生克隆開銷。

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

@Layton我可以知道'克隆'有什麼問題嗎? – kbvishnu 2013-08-21 04:56:05

+0

@VeeKayBee當然內存消耗 – 2013-08-26 09:56:33

+3

這應該是被接受的答案...副本有很多開銷。 – Edyn 2013-09-13 20:28:01

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,消息「數據表已經屬於另一個數據集「出現後,編寫行代碼myDataSet.Tables.Remove(myTable);//This works應用程序開始運行沒有問題,現在我可以多次點擊按鈕,而不會丟失值myTable並沒有錯誤消息。

我希望這可以提供幫助。

+0

對不起,'myDataSet.Tables.Remove(myTable); //這工作'行代碼(在我的代碼上面)必須在'myDataSet.WriteXml(「myTable.xml」)後''我確認代碼工作。 – GMarco1989 2015-09-18 10:28:42

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

相關問題