Visualizzazione dei risultati da 1 a 2 su 2
  1. #1
    Utente di HTML.it
    Registrato dal
    May 2006
    Messaggi
    54

    [VB.NET 2010] [FWK 4.0] Confrontare DataTable

    Buongiorno a tutti...
    Sto uscendo pazzo...sembra una cosa semplice e invece non riesco ad uscirne fuori.

    Ho un Datatable DT1 che contiene il contenuto di una tabella con due colonne; supponiamo ID e Descrizione dove ID è la chiave primaria.
    Siccome le modifiche alla tabella SQL possono essere effettuate anche da altre fonti, vorrei, supponiamo ciclicamente, andare a ricaricarmi i dati contenuti nella tabella in un DT2 con la stessa struttura e la stessa chiave primaria.

    Quello che vorrei ottenere, è un nuovo DataTable DT1 aggiornato dal quale, richiamando il metodo "GetChanges", ottengo solamente i record che sono stati Aggiunti, Modificati ed Eliminati.
    Siccome i due DataTable sono "statici" (ovvero non vengono modificati all'interno del codice, ma le tabelle SQL vengono modificate esternamente al programma), i metodi "GetChanges" restituiscono, ovviamente, un DataTable "Nothing".
    Il Merge della seconda tabella nella prima, invece, sembra funzionare (a mio avviso) molto male...ovvero...

    Se al parametro "PreserveChanges" del metodo "Merge" assegno il valore "True":
    -tutte le righe presenti sia in DT1 che in DT2, me le segna come "Modified" (anche se non sono state modificate) e con i valori originali di DT1
    -tutte le righe eliminate (non presenti in DT2), rimangono in DT1 segnate come "Unchanged"
    -tutte le righe aggiunte (presenti solo in DT2), vengono aggiunte a DT1 e segnate come "Unchanged"

    Se al parametro "PreserveChanges" del metodo "Merge" assegno il valore "False":
    -tutte le righe presenti sia in DT1 che in DT2, me le segna come "Unchanged" (con i valori aggiornati se sono state modificate)
    -tutte le righe eliminate (non presenti in DT2), rimangono in DT1 segnate come "Unchanged"
    -tutte le righe aggiunte (presenti solo in DT2), vengono aggiunte a DT1 e segnate come "Unchanged"

    Grazie anticipatamente a chi vorrà aiutarmi ad uscire da questo groviglio...vorrei evitare di effettuare 10000 cicli "for" sui DataTable, ma temo non ci sia via d'uscita.

  2. #2
    Utente di HTML.it
    Registrato dal
    May 2006
    Messaggi
    54
    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

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.