2012-01-12 38 views
34

Este error se produce al agregar una datatable de un conjunto de datos a otra . "DataTable ya pertenece a otro DataSet".DataTable ya pertenece a otro DataSet

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

Respuesta

70

Al igual que las otras respuestas señalan, el error que está viendo se debe a que la DataTable que intenta agregar a un DataSet ya es parte de un DataSet diferente.

Una solución es Copy DataTable y asignar la copia al otro DataSet.

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

El DataTable copiado tendrá la estructura y los datos del DataTable copiado.

Si solo desea la estructura de la DataTable, llame al Clone.

dtCopy = dataTable.Clone() 
+0

¿sabe por qué es así? Significado p. Lista myl = new Lista (); y luego agregué 3 elementos y hago esto myl [0] = myl [1] y esto funciona bien. Ya he agregado myl [1] a la lista. La pregunta es más genérica en Datatable sobre por qué y cómo se realiza esta comprobación si la tabla ya pertenece al Dataset – Dhananjay

+4

La copia tiene una gran sobrecarga ... vea la respuesta de Nathaniel Layton a continuación para una mejor solución. – Edyn

0

supongo que esto significa que el DataTable pertenece a otro conjunto de datos ...

Puede serialze DataTable a XML, a continuación, deserializar en el conjunto de datos de destino.

+0

Soy sólo la adición de una tabla de datos de un conjunto de datos a otra base de datos. para esto, necesitamos usar la serialización? – kbvishnu

+0

Una DataTable no puede residir en dos DataSets. Tal vez puedas eliminarlo del primero y agregarlo al segundo. Nunca lo intenté. – zmbq

+0

dv.ToTable.DefaultView.ToTable (False, strSelectedCols)). Tables (0) .Clone()) se trabajó para mí Gracias por su respuesta – kbvishnu

0

Creo que deberías crear una nueva DataTable e importar la estructura y los datos a la nueva.

2

intentar llamar a este método:

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

Esto creará una copia de la DataTable y asignarlo a la meta DataSet:

ds.Tables.Add(dt)

+0

Gracias abbas lo tengo :) – kbvishnu

+1

Clone solo copiará la estructura. . Copiar() copiará el esquema y los datos – kbvishnu

0

tratar de copiar la tabla con DataTable.Copy() método en el caso de que no es un conjunto de datos con tipo. Este método crea una nueva instancia de la misma mesa, así que no va a pertenecer a cualquier conjunto de datos:

tenue NEWTABLE como DataTable = oldTable.Copy() dv tenue como DataView = newTable.DefaultView

dsformulaValues.Tables. Agregar (m_DataAccess.GetFormulaValues ​​(dv.ToTable.DefaultView.ToTable (False, strSelectedCols)). Tablas (0))

27

La respuesta aceptada no es muy buena. La clonación siempre debe ser una última opción.

Aquí hay una manera de evitar el problema sin incurrir en la sobrecarga de la clonación.

 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 ¿Puedo saber cuál es el problema con 'Clone'? – kbvishnu

+0

@VeeKayBee Por supuesto, el consumo de memoria –

+3

Esta debería ser la respuesta aceptada ... copiar tiene una gran sobrecarga. – Edyn

0

que tenían el mismo problema y lo resolvió mediante Remove.En mi opinión, su código podría ser la siguiente:

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. 

Mi trabajo código era así:

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

Cada vez que se hace clic en el botón buttonSave, el mensaje “DataTable ya pertenece a otro DataSet "apareció. Después de escribir el código de línea myDataSet.Tables.Remove(myTable);//This works la aplicación comenzó a ejecutarse sin problemas y ahora puedo hacer clic en el botón más veces, sin perder el valor de myTable y sin el mensaje de error.

Espero que esto pueda ayudar.

+0

Lo sentimos, 'myDataSet.Tables.Remove (myTable); // El código de línea de este works' (en mi código anterior) debe ser DESPUÉS' myDataSet.WriteXml ("myTable.xml"); 'Confirmo que el código funciona. – GMarco1989

0

me encontré con una vuelta alrededor espero que pueda ayudar a

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

De alguna manera, incluso si _DataTable es nuevo, pero si se refiere a una tabla física cargada anterior se convierte en DataTable que heredar la configuración anterior.

0

La manera simple es simplemente combinar la tabla de la siguiente manera.

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

Cuestiones relacionadas