Il presente articolo è stato tradotto automaticamente. Passare il puntatore sulle frasi nell'articolo per visualizzare il testo originale. Ulteriori informazioni.
Traduzione
Originale
Questo argomento non è stato ancora valutato - Valuta questo argomento

Metodo DataTable.Load

Riempie una classe DataTable con valori di un'origine dati utilizzando l'interfaccia IDataReader fornita. Se DataTable contiene già righe, i dati in arrivo dall'origine dati vengono uniti alle righe esistenti.

Si tratta di un membro di overload. Per informazioni complete su questo membro, inclusi la sintassi, l'utilizzo e gli esempi, fare clic su un nome nell'elenco degli overload.

  Nome Descrizione
Metodo pubblico Load(IDataReader) Riempie una classe DataTable con valori di un'origine dati utilizzando l'interfaccia IDataReader fornita. Se DataTable contiene già righe, i dati in arrivo dall'origine dati vengono uniti alle righe esistenti.
Metodo pubblico Load(IDataReader, LoadOption) Riempie una classe DataTable con valori di un'origine dati utilizzando l'interfaccia IDataReader fornita. Se DataTable contiene già righe, i dati in arrivo dall'origine dati vengono uniti alle righe esistenti, in base al valore del parametro loadOption.
Metodo pubblico Load(IDataReader, LoadOption, FillErrorEventHandler) Riempie una classe DataTable con valori di un'origine dati utilizzando l'interfaccia IDataReader fornita, tramite un delegato di gestione degli errori.
In alto

Il metodo Load può essere utilizzato in diversi scenari comuni, tutti incentrati sull'ottenimento di dati da un'origine dati specificata e sull'aggiunta degli stessi al contenitore di dati corrente, in questo caso una classe DataTable. Questi scenari descrivono l'utilizzo standard per una classe DataTable, precisandone il comportamento per quanto riguarda aggiornamento e unione.

Una classe DataTable esegue la sincronizzazione o l'aggiornamento con un'origine dati primaria. La classe DataTable registra le modifiche, consentendo la sincronizzazione con l'origine dati primaria. Inoltre, una classe DataTable è in grado di accettare dati incrementali da una o più origini dati secondarie. DataTable non è responsabile per la registrazione delle modifiche allo scopo di consentire la sincronizzazione con l'origine dati secondaria.

Supponendo l'esistenza di due origini dati, un utente dovrà affidarsi probabilmente a uno dei due comportamenti seguenti:

  • Inizializzare DataTable da un'origine dati primaria. In questo scenario, l'utente intende inizializzare una classe DataTable vuota con valori dall'origine dati primaria. In un secondo momento propagherà le modifiche nuovamente all'origine dati primaria.

  • Conservare le modifiche ed eseguire nuovamente la sincronizzazione dall'origine dati primaria. In questo scenario, l'utente intende utilizzare la classe DataTable riempita nello scenario precedente ed eseguire una sincronizzazione incrementale con l'origine dati primaria, conservando le modifiche apportate nella classe DataTable.

  • Inserire dati incrementali da origini dati secondarie. In questo scenario, l'utente desidera unire le modifiche da una o più origini dati secondarie e propagare nuovamente tali modifiche all'origine dati primaria.

Il metodo Load rende possibili tutti gli scenari descritti sopra. Tutti gli overload di questo metodo, eccetto uno, consentono di specificare un parametro per l'opzione di caricamento, che indica la modalità con cui le righe che già si trovano in una classe DataTable vengono combinate con le righe che vengono caricate. L'overload che non consente di specificare il comportamento utilizza l'opzione di caricamento predefinita. Nella tabella riportata di seguito vengono descritte le tre opzioni di caricamento fornite dall'enumerazione LoadOption. In ogni caso, la descrizione indica il comportamento quando la chiave primaria di una riga nei dati in entrata corrisponde alla chiave primaria di una riga esistente.

Opzione di caricamento

Descrizione

PreserveChanges (impostazione predefinita)

Aggiorna la versione originale della riga con il valore della riga in entrata.

OverwriteChanges

Aggiorna la versione originale e la versione corrente della riga con il valore della riga in entrata.

Upsert

Aggiorna la versione corrente della riga con il valore della riga in entrata.

In generale, le opzioni PreserveChanges e OverwriteChanges sono indicate per scenari in cui l'utente ha necessità di sincronizzare la classe DataSet e le rispettive modifiche con l'origine dati primaria. L'opzione Upsert semplifica le modifiche di aggregazione da una o più origini dati secondarie.

Nell'esempio riportato di seguito vengono illustrati diversi problemi correlati alla chiamata del metodo Load. In primo luogo, nell'esempio vengono illustrati i problemi relativi allo schema, tra cui la derivazione di uno schema dall'interfaccia IDataReader caricata, quindi viene trattata la gestione di schemi incompatibili e di schemi con colonne mancanti o aggiuntive. Vengono poi trattati i problemi relativi ai dati, tra cui la gestione delle diverse opzioni di caricamento.

Nota Nota

Nell'esempio viene illustrato come utilizzare una delle versioni di overload del metodo Load. Per visualizzare altri esempi disponibili, vedere i singoli argomenti relativi all'overload.


static void Main()
{
    // This example examines a number of scenarios involving the 
    // DataTable.Load method.
    Console.WriteLine("Load a DataTable and infer its schema:");

    // The table has no schema. The Load method will infer the 
    // schema from the IDataReader:
    DataTable table = new DataTable();

    // Retrieve a data reader, based on the Customers data. In
    // an application, this data might be coming from a middle-tier
    // business object:
    DataTableReader reader = new DataTableReader(GetCustomers());

    table.Load(reader);
    PrintColumns(table);

    Console.WriteLine(" ============================= ");
    Console.WriteLine("Load a DataTable from an incompatible IDataReader:");

    // Create a table with a single integer column. Attempt
    // to load data from a reader with a schema that is 
    // incompatible. Note the exception, determined
    // by the particular incompatibility:
    table = GetIntegerTable();
    reader = new DataTableReader(GetStringTable());
    try
    {
        table.Load(reader);
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.GetType().Name + ":" + ex.Message);
    }

    Console.WriteLine(" ============================= ");
    Console.WriteLine(
        "Load a DataTable with an IDataReader that has extra columns:");

    // Note that loading a reader with extra columns adds
    // the columns to the existing table, if possible:
    table = GetIntegerTable();
    reader = new DataTableReader(GetCustomers());
    table.Load(reader);
    PrintColumns(table);

    Console.WriteLine(" ============================= ");
    Console.WriteLine(
        "Load a DataTable with an IDataReader that has missing columns:");

    // Note that loading a reader with missing columns causes 
    // the columns to be filled with null data, if possible:
    table = GetCustomers();
    reader = new DataTableReader(GetIntegerTable());
    table.Load(reader);
    PrintColumns(table);

    // Demonstrate the various possibilites when loading data into
    // a DataTable that already contains data.
    Console.WriteLine(" ============================= ");
    Console.WriteLine("Demonstrate data considerations:");
    Console.WriteLine("Current value, Original value, (RowState)");
    Console.WriteLine(" ============================= ");
    Console.WriteLine("Original table:");

    table = SetupModifiedRows();
    DisplayRowState(table);

    Console.WriteLine(" ============================= ");
    Console.WriteLine("Data in IDataReader to be loaded:");
    DisplayRowState(GetChangedCustomers());

    PerformDemo(LoadOption.OverwriteChanges);
    PerformDemo(LoadOption.PreserveChanges);
    PerformDemo(LoadOption.Upsert);

    Console.WriteLine("Press any key to continue.");
    Console.ReadKey();
}

private static void DisplayRowState(DataTable table)
{
    for (int i = 0; i <= table.Rows.Count - 1; i++)
    {
        object current = "--";
        object original = "--";
        DataRowState rowState = table.Rows[i].RowState;

        // Attempt to retrieve the current value, which doesn't exist
        // for deleted rows:
        if (rowState != DataRowState.Deleted)
        {
            current = table.Rows[i]["Name", DataRowVersion.Current];
        }

        // Attempt to retrieve the original value, which doesn't exist
        // for added rows:
        if (rowState != DataRowState.Added)
        {
            original = table.Rows[i]["Name", DataRowVersion.Original];
        }
        Console.WriteLine("{0}: {1}, {2} ({3})", i, current, 
            original, rowState);
    }
}

private static DataTable GetChangedCustomers()
{
    // Create sample Customers table.
    DataTable table = new DataTable();

    // Create two columns, ID and Name.
    DataColumn idColumn = table.Columns.Add("ID", typeof(int));
    table.Columns.Add("Name", typeof(string));

    // Set the ID column as the primary key column.
    table.PrimaryKey = new DataColumn[] { idColumn };

    table.Rows.Add(new object[] { 0, "XXX" });
    table.Rows.Add(new object[] { 1, "XXX" });
    table.Rows.Add(new object[] { 2, "XXX" });
    table.Rows.Add(new object[] { 3, "XXX" });
    table.Rows.Add(new object[] { 4, "XXX" });
    table.AcceptChanges();
    return table;
}

private static DataTable GetCustomers()
{
    // Create sample Customers table, in order
    // to demonstrate the behavior of the DataTableReader.
    DataTable table = new DataTable();

    // Create two columns, ID and Name.
    DataColumn idColumn = table.Columns.Add("ID", typeof(int));
    table.Columns.Add("Name", typeof(string));

    // Set the ID column as the primary key column.
    table.PrimaryKey = new DataColumn[] { idColumn };

    table.Rows.Add(new object[] { 0, "Mary" });
    table.Rows.Add(new object[] { 1, "Andy" });
    table.Rows.Add(new object[] { 2, "Peter" });
    table.AcceptChanges();
    return table;
}

private static DataTable GetIntegerTable()
{
    // Create sample Customers table, in order
    // to demonstrate the behavior of the DataTableReader.
    DataTable table = new DataTable();

    // Create two columns, ID and Name.
    DataColumn idColumn = table.Columns.Add("ID", typeof(int));

    // Set the ID column as the primary key column.
    table.PrimaryKey = new DataColumn[] { idColumn };

    table.Rows.Add(new object[] { 4 });
    table.Rows.Add(new object[] { 5 });
    table.AcceptChanges();
    return table;
}

private static DataTable GetStringTable()
{
    // Create sample Customers table, in order
    // to demonstrate the behavior of the DataTableReader.
    DataTable table = new DataTable();

    // Create two columns, ID and Name.
    DataColumn idColumn = table.Columns.Add("ID", typeof(string));

    // Set the ID column as the primary key column.
    table.PrimaryKey = new DataColumn[] { idColumn };

    table.Rows.Add(new object[] { "Mary" });
    table.Rows.Add(new object[] { "Andy" });
    table.Rows.Add(new object[] { "Peter" });
    table.AcceptChanges();
    return table;
}

private static void PerformDemo(LoadOption optionForLoad)
{

    // Load data into a DataTable, retrieve a DataTableReader containing
    // different data, and call the Load method. Depending on the
    // LoadOption value passed as a parameter, this procedure displays
    // different results in the DataTable.
    Console.WriteLine(" ============================= ");
    Console.WriteLine("table.Load(reader, {0})", optionForLoad);
    Console.WriteLine(" ============================= ");

    DataTable table = SetupModifiedRows();
    DataTableReader reader = new DataTableReader(GetChangedCustomers());
    table.RowChanging +=new DataRowChangeEventHandler(HandleRowChanging);

    table.Load(reader, optionForLoad);
    Console.WriteLine();
    DisplayRowState(table);
}

private static void PrintColumns(DataTable table)
{
    // Loop through all the rows in the DataTableReader
    foreach (DataRow row in table.Rows)
    {
        for (int i = 0; i < table.Columns.Count; i++)
        {
            Console.Write(row[i] + " ");
        }
        Console.WriteLine();
    }
}

private static DataTable SetupModifiedRows()
{
    // Fill a DataTable with customer info, and 
    // then modify, delete, and add rows.

    DataTable table = GetCustomers();
    // Row 0 is unmodified.
    // Row 1 is modified.
    // Row 2 is deleted.
    // Row 3 is added.
    table.Rows[1]["Name"] = "Sydney";
    table.Rows[2].Delete();
    DataRow row = table.NewRow();
    row["ID"] = 3;
    row["Name"] = "Melony";
    table.Rows.Add(row);

    // Note that the code doesn't call
    // table.AcceptChanges()
    return table;
}

static void HandleRowChanging(object sender, DataRowChangeEventArgs e)
{
    Console.WriteLine(
        "RowChanging event: ID = {0}, action = {1}", e.Row["ID"], 
        e.Action);
}


Il documento è risultato utile?
(1500 caratteri rimanenti)

Aggiunte alla community

AGGIUNGI
© 2013 Microsoft. Tutti i diritti riservati.