2009-09-22 9 views
5

Je rencontre des problèmes avec ADO.NET 2.0 fusion/importation de données. J'ai besoin de mettre à jour/insérer des données d'une table générique à une autre table avec les deux tables conservant un schéma identique. Le code suivant fonctionne très bien localement, mais ne fait pas de modifications à la base de données:DataTable.Merge et DataTable.ImportRow ne changent pas 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]); 

en est de même avec cet extrait de code:

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

Quand je regardais la propriété RowState pour changement/annexe les lignes restent "inchangées". Je veux éviter si possible les données mappant les colonnes, ce que je devrais faire en utilisant la méthode NewRow() et en modifiant une ligne existante.

+0

Je peux trouver une solution qui modifie RowState lors de l'utilisation de ImportRow. L'extrait de code suivant fonctionnera: dsLocal.Tables [0] .ImportRow (changedRow); dsLocal.Tables [0] .Rows [dsLocal.Tables [0] .Rows.Count - 1] .SetAdded(); Cependant, cela ne fonctionne que sur l'ajout de lignes et non sur la mise à jour des lignes. Toute idée sur la fusion serait très utile! –

Répondre

6

Vous devez déclencher la fonction appropriée pour chaque DataRow.

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

Cela mettra à jour la valeur DataRow.RowState. C'est ce que fait un DataAdapter pour déterminer quelles lignes ont besoin des actions effectuées sur eux.

Ce serait bien si leur quelque chose ressemblait à un ensemble de données lié dans .net afin qu'il gère ces détails banals pour nous.

+0

note, lorsque j'utilise 'row.SetAdded()', j'ai reçu une exception indiquant: * SetAdded et SetModified ne peuvent être utilisés que si l'état de la ligne est Inchangé. * – IAbstract

+0

Vous ne voulez en utiliser qu'un seul à la fois. – JeffO

5

Pour obtenir le comportement que vous voulez, je l'ai fait ce qui suit au lieu de dsLocal.Tables[0].Merge(dsChanges.Tables[0],false);:

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

Ce lit la table change et « upserts » dans la table « locale », vous donnant les notifications de modification appropriées.

+0

Génial, cette suggestion fonctionne. – user469104