2009-09-22 7 views
5

Tengo problemas con la combinación/importación de datos de ADO.NET 2.0. Necesito actualizar/insertar datos de una tabla genérica a otra tabla con ambas tablas manteniendo un esquema idéntico. El siguiente código funciona muy bien a nivel local, pero no realizar cambios en la base de datos:DataTable.Merge y DataTable.ImportRow no cambia RowState

 OleDbDataAdapter localDA = loadLocalData();    
     OleDbDataAdapter hostedDA = loadHostedData();    

     DataSet dsLocal = new DataSet();    
     localDA.Fill(dsLocal); 

     DataSet dsChanges = new DataSet(); 
     hostedDA.Fill(dsChanges); 

     dsLocal.Tables[0].Merge(dsChanges.Tables[0],false); 

     localDA.Update(dsLocal.Tables[0]); 

Lo mismo es cierto con este fragmento de código:

 OleDbDataAdapter localDA = loadLocalData(); 
     OleDbDataAdapter hostedDA = loadHostedData(); 

     DataSet dsLocal = new DataSet(); 
     localDA.Fill(dsLocal); 

     DataSet dsChanges = new DataSet(); 
     hostedDA.Fill(dsChanges); 

     foreach (DataRow changedRow in dsChanges.Tables[0].Rows) 
     { 
      if (recordExists(dsLocal.Tables[0], changedRow["ID"])) 
      { 

      } 
      else 
      { 
       dsLocal.Tables[0].ImportRow(changedRow); 
      } 
     } 

     localDA.Update(dsLocal.Tables[0]); 

Cuando miraba a la propiedad RowState para cambiar/anexa filas permanecen "sin cambios". Quiero evitar el mapeo de datos de las columnas si es posible, que es lo que debo hacer usando el método NewRow() y modificando una fila existente.

+0

Puedo encontrar una solución que modifique el RowState cuando use ImportRow. El siguiente fragmento de código funcionará: dsLocal.Tables [0] .ImportRow (changedRow); dsLocal.Tables [0] .Rows [dsLocal.Tables [0] .Rows.Count - 1] .SetAdded(); Sin embargo, esto solo funciona en filas anexas y no actualiza las filas. ¡Cualquier idea sobre fusión sería muy útil! –

Respuesta

6

Debe desactivar la función adecuada para cada DataRow.

  • DataRow.SetAdded()
  • DataRow.SetModified()

Esto actualizará el valor DataRow.RowState. Esto es lo que hace un DataAdapter para determinar qué filas necesitan qué acciones se realizan en ellas.

Sería bueno si fueran algo así como un conjunto de datos encuadernados en .net para que pueda gestionar estos detalles mundanos para nosotros.

+0

nota, cuando uso 'row.SetAdded()', recibí una excepción que indica: * SetAdded y SetModified solo se pueden usar cuando el estado de la fila es Sin cambios. * – IAbstract

+0

Solo desea utilizar uno de ellos a la vez. – JeffO

5

Para obtener el comportamiento que desea, hice lo siguiente en lugar de dsLocal.Tables[0].Merge(dsChanges.Tables[0],false);:

using (DataTableReader changeReader = new DataTableReader(dsChanges.Tables[0])) 
    dsLocal.Tables[0].Load(newTableReader, LoadOption.Upsert); 

Esto lee la tabla de cambios y "upserts" en la tabla 'local', que le da las notificaciones de cambio apropiados.

+0

Impresionante, esta sugerencia funciona. – user469104

Cuestiones relacionadas