Non avendo ricevuto risposta, io c'ho provato a modo mio...temo non sia la soluzione migliore, quindi, se qualcuno avesse voglia di darmi qualche dritta...ben venga:
codice:
'********************* PREPARAZIONE DEI DATI *********************
Dim MyPrimaryKey(0) As DataColumn
Dim dt1 As New DataTable
Dim dt2 As New DataTable
Dim dt3 As New DataTable
Dim a As Integer = 0
'Creo due DataTable identici con gli stessi dati
dt1.Columns.Add("ID", Type.GetType("System.Int32"))
dt1.Columns.Add("NAME", Type.GetType("System.String"))
dt2.Columns.Add("ID", Type.GetType("System.Int32"))
dt2.Columns.Add("NAME", Type.GetType("System.String"))
For i As Integer = 0 To 2
dt1.NewRow()
dt2.NewRow()
dt1.Rows.Add(New Object() {i, "NAME" & i})
dt2.Rows.Add(New Object() {i, "NAME" & i})
Next
'Imposto il PrimaryKey per entrambi i DataTable
MyPrimaryKey(0) = dt1.Columns("ID")
dt1.PrimaryKey = MyPrimaryKey
MyPrimaryKey(0) = dt2.Columns("ID")
dt2.PrimaryKey = MyPrimaryKey
dt1.AcceptChanges()
dt2.AcceptChanges()
'Simulo delle modifiche (esterne) al Database, rappresentate dal Datatable dt2
'(modifico la riga 2, elimino la riga 3 ed aggiungo una riga)
dt2.Rows(1).Item(1) = 10
dt2.Rows(2).Delete()
dt2.NewRow()
dt2.Rows.Add(New Object() {3, "PROVA"})
dt2.AcceptChanges()
'******************* FINE PREPARAZIONE DEI DATI ******************
'In un nuovo DataTable dt3, "mischio" i dati contenuti nel vecchio DataTable dt1 con quelli del
'nuovo DataTable dt2. Il Merge, non elimina dalla tabella di destinazione le righe mancanti
'dalla tabella di origine, ma non fa altro che aggiungere le righe aggiunte e modificare le righe
'esistenti
dt3 = dt1.Copy
dt3.Merge(dt2)
dt3.AcceptChanges()
'Ciclo sul nuovo datatable aggiornato
For Each dr As DataRow In dt3.Rows
'Cerco nel vecchio datatable...
Dim drV As DataRow = dt1.Rows.Find(dr(0))
If drV Is Nothing Then
'...se non lo trovo, la riga è stata aggiunta
dr.SetAdded()
Else
'...altrimenti, cerco nel nuovo DataTable...
Dim drN As DataRow = dt2.Rows.Find(dr(0))
If drN Is Nothing Then
'...se la riga non è stata trovata, è stata eliminata
dr.Delete()
Else
'...altrimenti, verifico se è stata modificata...
Dim comparer As IEqualityComparer(Of DataRow) = DataRowComparer.Default
Dim bEqual As Boolean = comparer.Equals(drN, drV)
If Not bEqual Then dr.SetModified()
End If
End If
Next
'Tramite GetChanges ottengo solo le righe eliminate/modificate/aggiunte per le quali, la proprietà
'"RowState" mi dice se la riga è stata eliminata/modificata/aggiunta
dt3 = dt3.GetChanges