DataTable уже принадлежит другому DataSet - PullRequest
39 голосов
/ 12 января 2012

Эта ошибка возникает при добавлении одного набора данных из набора данных в другой . "DataTable уже принадлежит другому DataSet."

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

Ответы [ 10 ]

79 голосов
/ 12 января 2012

Как и в других ответах, ошибка, которую вы видите, заключается в том, что DataTable, который вы пытаетесь добавить в DataSet, уже является частью другого DataSet.

Одним из решений является Копировать DataTable и назначить копию другому DataSet.

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

Скопированный DataTable будет иметь структуру и данные скопированного DataTable.

Если вам нужна только структура DataTable, вызовите Clone .

dtCopy = dataTable.Clone()
31 голосов
/ 21 августа 2013

Принятый ответ не очень хорош. Клонирование всегда должно быть последним вариантом.

Вот способ обойти проблему без дополнительных затрат на клонирование.

        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 голосов
/ 12 января 2012

Попробуйте вызвать этот метод:

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

Это создаст копию DataTable и назначит ее цели DataSet:

ds.Tables.Add(dt)

0 голосов
/ 31 января 2019

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

Это решение также может быть записано в одну строку

ds.Tables.Add (dataTable.Copy ());

0 голосов
/ 09 января 2017

Простой способ - объединить таблицу следующим образом.

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

0 голосов
/ 17 ноября 2015

Я нашел один оборот, надеюсь, он может помочь

_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 голосов
/ 18 сентября 2015

У меня была такая же проблема, и я решил ее, используя 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 и без сообщения об ошибке.

Надеюсь, это поможет.

0 голосов
/ 12 января 2012

Попробуйте скопировать таблицу с помощью метода DataTable.Copy () , если это не типизированный DataSet.Этот метод создает новый экземпляр той же таблицы, поэтому он не будет принадлежать какому-либо DataSet:

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

dsformulaValues.Tables.Add (m_DataAccess.GetFormulaValues ​​(dv.ToTable.DefaultView.ToTable (False, strSelectedCols)). Таблицы (0))

0 голосов
/ 12 января 2012

Я думаю, вам следует создать новую таблицу данных и импортировать структуру и данные в новую.

0 голосов
/ 12 января 2012

Полагаю, это означает, что DataTable принадлежит другому DataSet ...

Вы можете сериализовать DataTable в XML, а затем десериализовать его в целевой набор данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...