2009-09-22 12 views
5

Mam problemy z łączeniem/importowaniem danych ADO.NET 2.0. Muszę zaktualizować/wstawić dane z jednej ogólnej tabeli do innej tabeli przy obu tabelach zachowując identyczny schemat. Poniższy kod działa świetnie lokalnie, ale nie dokonywać zmian w bazie danych:DataTable.Merge i DataTable.ImportRow nie zmieniają 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]); 

Tak samo jest z tym fragmencie kodu:

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

Kiedy spojrzałem na miejscu RowState dla zmienił/dołączany wiersze pozostają "niezmienione". Chcę, jeśli to możliwe, uniknąć mapowania danych kolumn, co może być konieczne przy użyciu metody NewRow() i modyfikacji istniejącego wiersza.

+0

Mogę wymyślić rozwiązanie, które modyfikuje RowState podczas korzystania z ImportRow. Poniższy fragment kodu zadziała: dsLocal.Tables [0] .ImportRow (changedRow); dsLocal.Tables [0] .Rows [dsLocal.Tables [0] .Rows.Count - 1] .SetAdded(); Działa to jednak tylko w przypadku dołączania wierszy i nie aktualizowania wierszy. Wszelkie pomysły na scalanie będą bardzo pomocne! –

Odpowiedz

6

Musisz odpalić odpowiednią funkcję dla każdego DataRow.

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

To zaktualizować wartość DataRow.RowState. Oto, co przechodzi usługa DataAdapter, aby określić, które wiersze wymagają działań na nich wykonanych.

Byłoby miło, gdyby ich było coś w rodzaju zbioru danych w sieci .net, abyśmy mogli zarządzać tymi przyziemnymi szczegółami.

+0

Uwaga, gdy używam 'row.SetAdded()', otrzymałem wyjątek stwierdzający: * SetAdded i SetModified mogą być używane tylko wtedy, gdy status wiersza jest niezmieniony. * – IAbstract

+0

Używasz tylko jednego z nich na raz. – JeffO

5

Aby uzyskać zachowanie chcesz, zrobiłem następujące zamiast dsLocal.Tables[0].Merge(dsChanges.Tables[0],false);:

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

ten odczytuje tabelę zmian i „upserts” pod stołem „lokalne”, co daje odpowiednie powiadomienia o zmianie.

+0

Niesamowita, ta sugestia działa. – user469104

Powiązane problemy