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.