Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

    [ADO.NET] Merge di due tabelle identiche

    Ciao ho un problema serio con il metodo Merge dell' oggetto DataSet in ADO.NET.

    Allora, io ho due tabelle (DataTable) identiche.
    La mia necessita è di effettuare il merge dei dati, ovvero, ogni riga della DataTable1 deve sommare i valori a quelli della rispettiva riga della DataTable2.

    Con i passaggi sono arrivato fin qui :

    Creo le due DataTable
    Creo le key per le dataTable
    Le riempio di dati

    e poi???


  2. #2
    Utente di HTML.it L'avatar di darkblOOd
    Registrato dal
    Jul 2001
    Messaggi
    2,212
    ma il merge non è un metodo del DATASET e non del DataTable? :master:

    cmq per merge si intende unione o aggiunta ma non intesa come somma.

    Se hai una tabella in un dataset e vuoi aggiornare i dati della tabella con quelli presenti in un'altra tabella che abbia uno schema pressochè identico allora puoi chiamare il metodo merge del dataset


    penso che tu abbia inteso male la documentazione

    Libreria di classi .NET Framework

    Metodo DataSet.Merge (DataTable) [Visual Basic]Vedere anche
    Classe DataSet | Membri DataSet | Spazio dei nomi System.Data | Elenco di overload DataSet.Merge | DataTable | Estensioni gestite per la programmazione in C++
    Requisiti
    Piattaforme: Windows 98, Windows NT 4.0, Windows Millennium Edition, Windows 2000, Windows XP Home Edition, Windows XP Professional, Windows Server 2003 family
    Linguaggio
    C#

    C++

    JScript

    Visual Basic

    Mostra tutto
    Unisce un oggetto DataTable specificato e il relativo schema nell'oggetto DataSet corrente.

    [Visual Basic]
    Overloads Public Sub Merge( _
    ByVal table As DataTable _
    )

    [C#]
    public void Merge(
    DataTable table
    );

    [C++]
    public: void Merge(
    DataTable* table
    );

    [JScript]
    public function Merge(
    table : DataTable
    );

    Parametri
    table
    Oggetto DataTable di cui verranno uniti i dati e lo schema.
    Eccezioni
    Tipo di eccezione Condizione
    ArgumentNullException Il parametro dataSet è riferimento Null (Nothing in Visual Basic).

    Osservazioni
    Il metodo Merge viene utilizzato per unire due oggetti DataSet che contengono schemi molto simili. Un'unione viene utilizzata in genere in un'applicazione client per incorporare le ultime modifiche di un'origine dati in un oggetto DataSet esistente, consentendo all'applicazione client di disporre di un oggetto DataSet aggiornato con i dati più recenti dell'origine dati.

    Il metodo Merge viene in genere chiamato alla fine di una serie di routine che prevedono la convalida delle modifiche, la risoluzione degli errori, l'aggiornamento dell'origine dati con le modifiche e infine l'aggiornamento dell'oggetto DataSet esistente.

    In un'applicazione client è di solito previsto un singolo pulsante su cui è possibile fare clic per raccogliere i dati modificati e convalidarli prima di inviarli a un componente di livello medio. In questo scenario, viene richiamato dapprima il metodo GetChanges. Questo metodo restituisce un secondo oggetto DataSet ottimizzato per la convalida e l'unione. Il secondo oggetto DataSet contiene solo gli oggetti DataTable e DataRow che hanno subito modifiche e rappresenta quindi un sottoinsieme dell'oggetto DataSet originale. Questo sottoinsieme è in genere di dimensioni ridotte ed è pertanto più agevole da passare a componenti di livello medio. L'origine dati verrà quindi aggiornata dal componente di livello medio con le modifiche mediante le stored procedure. Il livello medio può quindi restituire un nuovo oggetto DataSet che include i dati originali e gli ultimi dati dell'origine dati, se viene eseguita di nuovo la query originale, oppure restituire il sottoinsieme con le eventuali modifiche apportate dall'origine dati. Se ad esempio l'origine dati crea automaticamente valori di chiave primaria univoci, tali valori potranno essere ridistribuiti all'applicazione client. In entrambi i casi, l'oggetto DataSet restituito può essere unito di nuovo all'oggetto DataSet originale dell'applicazione client con il metodo Merge.

    Quando viene chiamato il metodo Merge, vengono confrontati gli schemi dei due oggetti DataSet perché è possibile che abbiano subito modifiche. In uno scenario business-to-business è possibile che le nuove colonne siano state aggiunte a uno schema XML mediante un processo automatizzato. Se l'oggetto DataSet di origine contiene elementi dello schema (oggetti DataColumn aggiunti) che mancano nella destinazione, sarà possibile aggiungerli alla destinazione impostando l'argomento missingSchemaAction su MissingSchemaAction.Add. Nell'oggetto DataSet unito saranno così presenti lo schema e i dati aggiunti.

    Dopo l'unione degli schemi, viene eseguita l'unione dei dati.

    Quando viene eseguita l'unione di un nuovo oggetto DataSet di origine nella destinazione, ogni riga di origine con un valore DataRowState Unchanged, Modified o Deleted viene fatta corrispondere alla riga di destinazione con lo stesso valore di chiave primaria. Le righe di origine il cui valore DataRowState è Added vengono fatte corrispondere alle nuove righe di destinazione con gli stessi valori di chiave primaria delle nuove righe di origine.

    Durante un'unione, i vincoli sono disattivati. Se non è possibile attivare uno o più vincoli alla fine dell'unione, verrà generata l'eccezione ConstraintException e i dati uniti verranno mantenuti, mentre i vincoli verranno disattivati. In questo caso, la proprietà EnforceConstraints è impostata su false e tutte le righe non valide sono segnalate come errori. Prima di tentare di reimpostare la proprietà EnforceConstraints su true, è necessario risolvere gli errori.

    Esempio
    [Visual Basic, C#] Nell'esempio seguente viene creato un semplice oggetto DataSet con una tabella, due colonne e dieci righe. Viene creato un secondo oggetto DataTable identico al primo. Vengono aggiunte due righe alla seconda tabella, che viene quindi unita nell'oggetto DataSet.

    [Visual Basic]
    Private Sub DemonstrateMergeTable()
    ' Create a DataSet with one table, two columns, and ten rows.
    Dim ds As New DataSet("myDataSet")
    Dim t As New DataTable("Items")

    ' Add tables to the DataSet
    ds.Tables.Add(t)

    ' Add columns
    Dim c1 As New DataColumn("id", Type.GetType("System.Int32"), "")
    Dim c2 As New DataColumn("Item", Type.GetType("System.Int32"), "")
    t.Columns.Add(c1)
    t.Columns.Add(c2)

    ' DataColumn array to set primary key.
    Dim keyCol(1) As DataColumn

    ' Set primary key column.
    keyCol(0) = c1
    t.PrimaryKey = keyCol

    ' Add RowChanged event handler for the table.
    AddHandler t.RowChanged, AddressOf Row_Changed

    ' Add ten rows.
    Dim i As Integer
    Dim r As DataRow

    For i = 0 To 9
    r = t.NewRow()
    r("id") = i
    r("Item") = i
    t.Rows.Add(r)
    Next i

    ' Accept changes.
    ds.AcceptChanges()
    PrintValues(ds, "Original values")

    ' Create a second DataTable identical to the first.
    Dim t2 As DataTable
    t2 = t.Clone()

    ' Add three rows. Note that the id column can't be the
    ' same as existing rows in the DataSet table.
    Dim newRow As DataRow
    newRow = t2.NewRow()
    newRow("id") = 14
    newRow("Item") = 774
    t2.Rows.Add(newRow)

    newRow = t2.NewRow()
    newRow("id") = 12
    newRow("Item") = 555
    t2.Rows.Add(newRow)

    newRow = t2.NewRow()
    newRow("id") = 13
    newRow("Item") = 665
    t2.Rows.Add(newRow)

    ' Merge the table into the DataSet.
    Console.WriteLine("Merging")
    ds.Merge(t2)
    PrintValues(ds, "Merged With Table")
    End Sub 'DemonstrateMergeTable

    Private Sub Row_Changed(sender As Object, e As DataRowChangeEventArgs)
    Console.WriteLine("Row Changed " + e.Action.ToString() _
    + ControlChars.Tab + e.Row.ItemArray(0).ToString())
    End Sub 'Row_Changed

    Private Sub PrintValues(ds As DataSet, label As String)
    Console.WriteLine(ControlChars.Cr + label)
    Dim t As DataTable
    Dim r As DataRow
    Dim c As DataColumn
    For Each t In ds.Tables
    Console.WriteLine("TableName: " + t.TableName)
    For Each r In t.Rows
    For Each c In t.Columns
    Console.Write(ControlChars.Tab + " " + r(c).ToString())
    Next c
    Console.WriteLine()
    Next r
    Next t
    End Sub

    [C#]
    private void DemonstrateMergeTable(){
    // Create a DataSet with one table, two columns, and ten rows.
    DataSet ds = new DataSet("myDataSet");
    DataTable t = new DataTable("Items");

    // Add table to the DataSet
    ds.Tables.Add(t);

    // Add columns
    DataColumn c1 = new DataColumn("id", Type.GetType("System.Int32"),"");
    DataColumn c2 = new DataColumn("Item", Type.GetType("System.Int32"),"");
    t.Columns.Add(c1);
    t.Columns.Add(c2);

    // DataColumn array to set primary key.
    DataColumn[] keyCol= new DataColumn[1];

    // Set primary key column.
    keyCol[0]= c1;
    t.PrimaryKey=keyCol;

    // Add a RowChanged event handler for the table.
    t.RowChanged += new DataRowChangeEventHandler(Row_Changed);

    // Add ten rows.
    for(int i = 0; i <10;i++){
    DataRow r=t.NewRow();
    r["id"] = i;
    r["Item"]= i;
    t.Rows.Add(r);
    }
    // Accept changes.
    ds.AcceptChanges();

    PrintValues(ds, "Original values");

    // Create a second DataTable identical to the first.
    DataTable t2 = t.Clone();

    // Add three rows. Note that the id column can't be the
    // same as existing rows in the DataSet table.
    DataRow newRow;
    newRow = t2.NewRow();
    newRow["id"] = 14;
    newRow["item"] = 774;

    //Note the alternative method for adding rows.
    t2.Rows.Add(new Object[] { 12, 555 });
    t2.Rows.Add(new Object[] { 13, 665 });

    // Merge the table into the DataSet
    Console.WriteLine("Merging");
    ds.Merge(t2);
    PrintValues(ds, "Merged With table.");

    }

    private void Row_Changed(object sender, DataRowChangeEventArgs e){
    Console.WriteLine("Row Changed " + e.Action.ToString() + "\t" + e.Row.ItemArray[0]);
    }

    private void PrintValues(DataSet ds, string label){
    Console.WriteLine("\n" + label);
    foreach(DataTable t in ds.Tables){
    Console.WriteLine("TableName: " + t.TableName);
    foreach(DataRow r in t.Rows){
    foreach(DataColumn c in t.Columns){
    Console.Write("\t " + r[c] );
    }
    Console.WriteLine();
    }
    }
    }

    [C++, JScript] Nessun esempio disponibile per C++ o JScript. Per visualizzare un esempio di Visual Basic o C#, fare clic sul pulsante Filtro linguaggio nell'angolo superiore sinistro della pagina.

    Requisiti
    Piattaforme: Windows 98, Windows NT 4.0, Windows Millennium Edition, Windows 2000, Windows XP Home Edition, Windows XP Professional, Windows Server 2003 family

    Vedere anche
    Classe DataSet | Membri DataSet | Spazio dei nomi System.Data | Elenco di overload DataSet.Merge | DataTable | Estensioni gestite per la programmazione in C++


    Sintassi basata su .NET Framework versione 1.1.4322.
    15 novembre 2002.


    --------------------------------------------------------------------------------

    Invia commenti su questo argomento.

    © 2001-2002 Microsoft Corporation. Tutti i diritti riservati.

  3. #3
    Innanzitutto ti ringrazio per il megapost, ma tranquillo l' MSDN ce l' ho pure io.

    Comunque si effettivamente per quello che serve a me dovrei prima effettuare un merge e poi creare delle colonne somma, applicate tramite un row.find ... e sinceramente mi spaventa solo l' idea ...

    Pensavo ad una bella serie di UNION e poi il resto va da se ...

    Che dici?


  4. #4
    Utente di HTML.it L'avatar di darkblOOd
    Registrato dal
    Jul 2001
    Messaggi
    2,212
    anche con la union mi sa che non ti sbrighi prima...

    tu, in sintesi, cosa dovresti fare?

  5. #5
    No Dark spiegarti diventa complicato, sto risolvendo con un merge di 3 DataTable (in 3 Ds) e da qui creo delle colonne con funzioni di Somma e GroupBy ...

    Sembra riuscire la cosa anche se mi sto spaccando la testa ...

    Ti ringrazio molto per l' interessamente, ma le tabelle sono complesse da psiegare ..


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.