DataTable.Load Methode

Definitie

Vult een DataTable met waarden uit een gegevensbron op met behulp van de opgegeven IDataReader. Als de DataTable al rijen bevat, worden de binnenkomende gegevens uit de gegevensbron samengevoegd met de bestaande rijen.

Overloads

Name Description
Load(IDataReader)

Vult een DataTable met waarden uit een gegevensbron op met behulp van de opgegeven IDataReader. Als de DataTable al rijen bevat, worden de binnenkomende gegevens uit de gegevensbron samengevoegd met de bestaande rijen.

Load(IDataReader, LoadOption)

Vult een DataTable met waarden uit een gegevensbron op met behulp van de opgegeven IDataReader. Als de DataTable al rijen bevat, worden de binnenkomende gegevens uit de gegevensbron samengevoegd met de bestaande rijen op basis van de waarde van de loadOption parameter.

Load(IDataReader, LoadOption, FillErrorEventHandler)

Vult een DataTable met waarden uit een gegevensbron met behulp van de opgegeven IDataReader met behulp van een gemachtigde voor foutafhandeling.

Voorbeelden

In het volgende voorbeeld ziet u een aantal problemen met betrekking tot het aanroepen van de Load methode. Ten eerste richt het voorbeeld zich op schemaproblemen, waaronder het uitstellen van een schema uit de geladen IDataReaderschema's en het verwerken van incompatibele schema's en schema's met ontbrekende of aanvullende kolommen. Het voorbeeld richt zich vervolgens op gegevensproblemen, waaronder het verwerken van de verschillende laadopties.

Note

In dit voorbeeld ziet u hoe u een van de overbelaste versies van Load. Zie de onderwerpen over overbelasting voor afzonderlijke overbelasting voor andere voorbeelden die mogelijk beschikbaar zijn.

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);
}
Sub Main()
  Dim table As New DataTable()

  ' This example examines a number of scenarios involving the 
  ' DataTable.Load method.
  Console.WriteLine("Load a DataTable and infer its schema:")

  ' Retrieve a data reader, based on the Customers data. In
  ' an application, this data might be coming from a middle-tier
  ' business object:
  Dim reader As New DataTableReader(GetCustomers())

  ' The table has no schema. The Load method will infer the 
  ' schema from the IDataReader:
  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 ex As Exception
    Console.WriteLine(ex.GetType.Name & ":" & ex.Message())
  End Try

  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()
End Sub

Private Sub DisplayRowState(ByVal table As DataTable)
  For i As Integer = 0 To table.Rows.Count - 1
    Dim current As Object = "--"
    Dim original As Object = "--"
    Dim rowState As DataRowState = table.Rows(i).RowState

    ' Attempt to retrieve the current value, which doesn't exist
    ' for deleted rows:
    If rowState <> DataRowState.Deleted Then
      current = table.Rows(i)("Name", DataRowVersion.Current)
    End If

    ' Attempt to retrieve the original value, which doesn't exist
    ' for added rows:
    If rowState <> DataRowState.Added Then
      original = table.Rows(i)("Name", DataRowVersion.Original)
    End If
    Console.WriteLine("{0}: {1}, {2} ({3})", i, current, original, rowState)
  Next
End Sub

Private Function GetChangedCustomers() As DataTable
  ' Create sample Customers table.
  Dim table As New DataTable

  ' Create two columns, ID and Name.
  Dim idColumn As DataColumn = table.Columns.Add("ID", GetType(Integer))
  table.Columns.Add("Name", GetType(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
End Function

Private Function GetCustomers() As DataTable
  ' Create sample Customers table.
  Dim table As New DataTable

  ' Create two columns, ID and Name.
  Dim idColumn As DataColumn = table.Columns.Add("ID", GetType(Integer))
  table.Columns.Add("Name", GetType(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
End Function

Private Function GetIntegerTable() As DataTable
  ' Create sample table with a single Int32 column.
  Dim table As New DataTable

  Dim idColumn As DataColumn = table.Columns.Add("ID", GetType(Integer))

  ' 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
End Function

Private Function GetStringTable() As DataTable
  ' Create sample table with a single String column.
  Dim table As New DataTable

  Dim idColumn As DataColumn = table.Columns.Add("ID", GetType(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
End Function

Private Sub PerformDemo(ByVal optionForLoad As LoadOption)

  ' 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(" ============================= ")

  Dim table As DataTable = SetupModifiedRows()
  Dim reader As New DataTableReader(GetChangedCustomers())
  AddHandler table.RowChanging, New _
      DataRowChangeEventHandler(AddressOf HandleRowChanging)

  table.Load(reader, optionForLoad)
  Console.WriteLine()
  DisplayRowState(table)
End Sub

Private Sub PrintColumns( _
   ByVal table As DataTable)

  ' Loop through all the rows in the DataTableReader.
  For Each row As DataRow In table.Rows
    For Each col As DataColumn In table.Columns
      Console.Write(row(col).ToString() & " ")
    Next
    Console.WriteLine()
  Next
End Sub

Private Function SetupModifiedRows() As DataTable
  ' Fill a DataTable with customer info, and 
  ' then modify, delete, and add rows.

  Dim table As DataTable = 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()
  Dim row As DataRow = table.NewRow
  row("ID") = 3
  row("Name") = "Melony"
  table.Rows.Add(row)

  ' Note that the code doesn't call
  ' table.AcceptChanges()
  Return table
End Function

Private Sub HandleRowChanging(ByVal sender As Object, _
  ByVal e As System.Data.DataRowChangeEventArgs)
  Console.WriteLine( _
      "RowChanging event: ID = {0}, action = {1}", e.Row("ID"), _
      e.Action)
End Sub

Opmerkingen

De Load methode kan worden gebruikt in verschillende veelvoorkomende scenario's, waarbij alle gecentreerd zijn om gegevens op te halen uit een opgegeven gegevensbron en deze toe te voegen aan de huidige gegevenscontainer (in dit geval een DataTable). In deze scenario's wordt standaardgebruik beschreven voor een DataTable, waarin het update- en samenvoeggedrag wordt beschreven.

Een DataTable synchronisatie of updates met één primaire gegevensbron. Hiermee DataTable worden wijzigingen bijgehouden, waardoor synchronisatie met de primaire gegevensbron mogelijk is. Daarnaast kan een DataTable database incrementele gegevens uit een of meer secundaire gegevensbronnen accepteren. Het DataTable is niet verantwoordelijk voor het bijhouden van wijzigingen om synchronisatie met de secundaire gegevensbron toe te staan.

Gezien deze twee hypothetische gegevensbronnen is een gebruiker waarschijnlijk een van de volgende gedragingen vereist:

  • Initialiseer DataTable vanuit een primaire gegevensbron. In dit scenario wil de gebruiker een lege DataTable waarde initialiseren met waarden uit de primaire gegevensbron. Later wil de gebruiker wijzigingen doorgeven aan de primaire gegevensbron.

  • Wijzigingen behouden en opnieuw synchroniseren vanuit de primaire gegevensbron. In dit scenario wil de gebruiker het DataTable ingevulde scenario invullen en een incrementele synchronisatie uitvoeren met de primaire gegevensbron, waarbij de wijzigingen in de DataTablegegevensbron behouden blijven.

  • Incrementele gegevensfeed van secundaire gegevensbronnen. In dit scenario wil de gebruiker wijzigingen uit een of meer secundaire gegevensbronnen samenvoegen en deze wijzigingen doorgeven aan de primaire gegevensbron.

De Load methode maakt al deze scenario's mogelijk. Met een van de overbelastingen voor deze methode kunt u een parameter voor de belastingsoptie opgeven, waarmee wordt aangegeven hoe rijen al in een DataTable combinatie met rijen worden geladen. (De overbelasting waarmee u het gedrag niet kunt opgeven, maakt gebruik van de standaardtaakoptie.) In de volgende tabel worden de drie laadopties beschreven die worden geboden door de LoadOption opsomming. In elk geval geeft de beschrijving het gedrag aan wanneer de primaire sleutel van een rij in de binnenkomende gegevens overeenkomt met de primaire sleutel van een bestaande rij.

Optie voor laden Description
PreserveChanges (standaard) Hiermee wordt de oorspronkelijke versie van de rij bijgewerkt met de waarde van de binnenkomende rij.
OverwriteChanges Hiermee werkt u de huidige en oorspronkelijke versies van de rij bij met de waarde van de binnenkomende rij.
Upsert Hiermee wordt de huidige versie van de rij bijgewerkt met de waarde van de binnenkomende rij.

Over het algemeen zijn de PreserveChanges en OverwriteChanges opties bedoeld voor scenario's waarin de gebruiker de DataSet en de wijzigingen moet synchroniseren met de primaire gegevensbron. De Upsert optie vereenvoudigt het samenvoegen van wijzigingen uit een of meer secundaire gegevensbronnen.

Load(IDataReader)

Vult een DataTable met waarden uit een gegevensbron op met behulp van de opgegeven IDataReader. Als de DataTable al rijen bevat, worden de binnenkomende gegevens uit de gegevensbron samengevoegd met de bestaande rijen.

public:
 void Load(System::Data::IDataReader ^ reader);
public void Load(System.Data.IDataReader reader);
member this.Load : System.Data.IDataReader -> unit
Public Sub Load (reader As IDataReader)

Parameters

reader
IDataReader

Een IDataReader die een resultatenset biedt.

Voorbeelden

In het volgende voorbeeld ziet u een aantal problemen met betrekking tot het aanroepen van de Load methode. Ten eerste richt het voorbeeld zich op schemaproblemen, waaronder het uitstellen van een schema uit de geladen IDataReaderschema's en het verwerken van incompatibele schema's en schema's met ontbrekende of aanvullende kolommen. In het voorbeeld wordt vervolgens de Load methode aangeroepen, waarbij de gegevens zowel vóór als na de laadbewerking worden weergegeven.

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());

    // Load data into a DataTable, retrieve a DataTableReader
    // containing different data, and call the Load method.
    Console.WriteLine(" ============================= ");
    Console.WriteLine("table.Load(reader)");
    Console.WriteLine(" ============================= ");

    table = SetupModifiedRows();
    reader = new DataTableReader(GetChangedCustomers());
    table.Load(reader);
    DisplayRowState(table);

    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[] { 1, "XXX" });
    table.Rows.Add(new object[] { 2, "XXX" });
    table.Rows.Add(new object[] { 3, "XXX" });
    table.Rows.Add(new object[] { 4, "XXX" });
    table.Rows.Add(new object[] { 5, "XXX" });
    table.Rows.Add(new object[] { 6, "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[] { 1, "Mary" });
    table.Rows.Add(new object[] { 2, "Andy" });
    table.Rows.Add(new object[] { 3, "Peter" });
    table.Rows.Add(new object[] { 4, "Russ" });
    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[] { 5 });
    table.Rows.Add(new object[] { 6 });
    table.Rows.Add(new object[] { 7 });
    table.Rows.Add(new object[] { 8 });
    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.Rows.Add(new object[] { "Russ" });
    table.AcceptChanges();
    return 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 5 is added.
    table.Rows[1]["Name"] = "Sydney";
    table.Rows[2].Delete();
    DataRow row = table.NewRow();
    row["ID"] = 5;
    row["Name"] = "Melony";
    table.Rows.Add(row);

    // Note that the code doesn't call
    // table.AcceptChanges()
    return table;
}
Sub 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:
  Dim table As 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:
  Dim reader As 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 ex As Exception
    Console.WriteLine(ex.GetType.Name & ":" & ex.Message())
  End Try

  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())

  ' Load data into a DataTable, retrieve a DataTableReader 
  ' containing different data, and call the Load method. 
  Console.WriteLine(" ============================= ")
  Console.WriteLine("table.Load(reader)")
  Console.WriteLine(" ============================= ")

  table = SetupModifiedRows()
  reader = New DataTableReader(GetChangedCustomers())
  table.Load(reader)
  DisplayRowState(table)

  Console.WriteLine("Press any key to continue.")
  Console.ReadKey()
End Sub

Private Sub DisplayRowState(ByVal table As DataTable)
  For i As Integer = 0 To table.Rows.Count - 1
    Dim current As Object = "--"
    Dim original As Object = "--"
    Dim rowState As DataRowState = table.Rows(i).RowState

    ' Attempt to retrieve the current value, which doesn't exist
    ' for deleted rows:
    If rowState <> DataRowState.Deleted Then
      current = table.Rows(i)("Name", DataRowVersion.Current)
    End If

    ' Attempt to retrieve the original value, which doesn't exist
    ' for added rows:
    If rowState <> DataRowState.Added Then
      original = table.Rows(i)("Name", DataRowVersion.Original)
    End If
    Console.WriteLine("{0}: {1}, {2} ({3})", i, _
      current, original, rowState)
  Next
End Sub

Private Function GetChangedCustomers() As DataTable
  ' Create sample Customers table.
  Dim table As New DataTable

  ' Create two columns, ID and Name.
  Dim idColumn As DataColumn = table.Columns.Add("ID", _
      GetType(Integer))
  table.Columns.Add("Name", GetType(String))

  ' Set the ID column as the primary key column.
  table.PrimaryKey = New DataColumn() {idColumn}

  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.Rows.Add(New Object() {5, "XXX"})
  table.Rows.Add(New Object() {6, "XXX"})
  table.AcceptChanges()
  Return table
End Function

Private Function GetCustomers() As DataTable
  ' Create sample Customers table.
  Dim table As New DataTable

  ' Create two columns, ID and Name.
  Dim idColumn As DataColumn = table.Columns.Add("ID", _
      GetType(Integer))
  table.Columns.Add("Name", GetType(String))

  ' Set the ID column as the primary key column.
  table.PrimaryKey = New DataColumn() {idColumn}

  table.Rows.Add(New Object() {1, "Mary"})
  table.Rows.Add(New Object() {2, "Andy"})
  table.Rows.Add(New Object() {3, "Peter"})
  table.Rows.Add(New Object() {4, "Russ"})
  table.AcceptChanges()
  Return table
End Function

Private Function GetIntegerTable() As DataTable
  ' Create sample table with a single Int32 column.
  Dim table As New DataTable

  Dim idColumn As DataColumn = table.Columns.Add("ID", _
      GetType(Integer))

  ' Set the ID column as the primary key column.
  table.PrimaryKey = New DataColumn() {idColumn}

  table.Rows.Add(New Object() {5})
  table.Rows.Add(New Object() {6})
  table.Rows.Add(New Object() {7})
  table.Rows.Add(New Object() {8})
  table.AcceptChanges()
  Return table
End Function

Private Function GetStringTable() As DataTable
  ' Create sample table with a single String column.
  Dim table As New DataTable

  Dim idColumn As DataColumn = table.Columns.Add("ID", _
      GetType(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.Rows.Add(New Object() {"Russ"})
  table.AcceptChanges()
  Return table
End Function

Private Sub PrintColumns( _
   ByVal table As DataTable)

  ' Loop through all the rows in the DataTableReader.
  For Each row As DataRow In table.Rows
    For Each col As DataColumn In table.Columns
      Console.Write(row(col).ToString() & " ")
    Next
    Console.WriteLine()
  Next
End Sub

Private Function SetupModifiedRows() As DataTable
  ' Fill a DataTable with customer info, and 
  ' then modify, delete, and add rows.

  Dim table As DataTable = GetCustomers()
  ' Row 0 is unmodified.
  ' Row 1 is modified.
  ' Row 2 is deleted.
  ' Row 5 is added.
  table.Rows(1)("Name") = "Sydney"
  table.Rows(2).Delete()
  Dim row As DataRow = table.NewRow
  row("ID") = 5
  row("Name") = "Melony"
  table.Rows.Add(row)

  ' Note that the code doesn't call
  ' table.AcceptChanges()
  Return table
End Function

Opmerkingen

De Load methode verbruikt de eerste resultatenset van de geladen IDataReader, en na een geslaagde voltooiing stelt u de positie van de lezer in op de volgende resultatenset, indien van toepassing. Bij het converteren van gegevens gebruikt de Load methode dezelfde conversieregels als de DbDataAdapter.Fill methode.

De Load methode moet rekening houden met drie specifieke problemen bij het laden van de gegevens van een IDataReader exemplaar: schema-, gegevens- en gebeurtenisbewerkingen. Wanneer u met het schema werkt, kan de Load methode voorwaarden tegenkomen, zoals beschreven in de volgende tabel. De schemabewerkingen vinden plaats voor alle geïmporteerde resultatensets, zelfs voor alle geïmporteerde resultatensets die geen gegevens bevatten.

Condition Gedrag
Het DataTable heeft geen schema. De Load methode leidt het schema af op basis van de resultatenset van de geïmporteerde IDataReader.
Het DataTable heeft een schema, maar is niet compatibel met het geladen schema. De Load methode genereert een uitzondering die overeenkomt met de specifieke fout die optreedt bij het laden van gegevens in het niet-compatibele schema.
De schema's zijn compatibel, maar het geladen schema van de resultatenset bevat kolommen die niet bestaan in de DataTable. Met Load de methode worden de extra kolommen aan DataTablehet schema toegevoegd. De methode genereert een uitzondering als overeenkomende kolommen in de DataTable en de geladen resultatenset niet compatibel zijn met de waarde. De methode haalt ook beperkingsgegevens op uit de resultatenset voor alle toegevoegde kolommen. Met uitzondering van de primaire-sleutelbeperking wordt deze beperkingsgegevens alleen gebruikt als de huidige DataTable geen kolommen bevat aan het begin van de belastingsbewerking.
De schema's zijn compatibel, maar het geladen schema van de resultatenset bevat minder kolommen dan het DataTable. Als een ontbrekende kolom een standaardwaarde heeft gedefinieerd of het gegevenstype van de kolom null is, Load kunnen de rijen worden toegevoegd, waarbij de standaardwaarde of null waarde voor de ontbrekende kolom wordt vervangen. Als er geen standaardwaarde of null kan worden gebruikt, genereert de Load methode een uitzondering. Als er geen specifieke standaardwaarde is opgegeven, gebruikt de Load methode de null waarde als de impliciete standaardwaarde.

Voordat u rekening houdt met het gedrag van de Load methode in termen van gegevensbewerkingen, moet u overwegen dat elke rij in een DataTable rij zowel de huidige waarde als de oorspronkelijke waarde voor elke kolom onderhoudt. Deze waarden kunnen gelijkwaardig zijn of kunnen afwijken als de gegevens in de rij zijn gewijzigd sinds het invullen van de DataTable. Zie Rijstatussen en rijversies voor meer informatie.

Deze versie van de Load methode probeert de huidige waarden in elke rij te behouden, waardoor de oorspronkelijke waarde intact blijft. (Als u meer controle wilt over het gedrag van binnenkomende gegevens, raadpleegt DataTable.Loadu .) Als de bestaande rij en de binnenkomende rij overeenkomende primaire-sleutelwaarden bevatten, wordt de rij verwerkt met de huidige rijstatuswaarde, anders wordt deze beschouwd als een nieuwe rij.

In termen van gebeurtenisbewerkingen vindt de RowChanging gebeurtenis plaats voordat elke rij wordt gewijzigd en vindt de RowChanged gebeurtenis plaats nadat elke rij is gewijzigd. In elk geval bevat de Action eigenschap van het DataRowChangeEventArgs exemplaar dat is doorgegeven aan de gebeurtenis-handler informatie over de specifieke actie die aan de gebeurtenis is gekoppeld. Deze actiewaarde is afhankelijk van de status van de rij vóór de laadbewerking. In elk geval vinden beide gebeurtenissen plaats en is de actie voor elke gebeurtenis hetzelfde. De actie kan worden toegepast op de huidige of oorspronkelijke versie van elke rij, of beide, afhankelijk van de huidige rijstatus.

In de volgende tabel wordt het gedrag voor de Load methode weergegeven. De laatste rij (met het label ((Niet aanwezig)) beschrijft het gedrag voor binnenkomende rijen die niet overeenkomen met een bestaande rij. Elke cel in deze tabel beschrijft de huidige en oorspronkelijke waarde voor een veld in een rij, samen met de DataRowState waarde nadat de Load methode is voltooid. In dit geval staat de methode u niet toe om de laadoptie aan te geven en wordt de standaardwaarde PreserveChangesgebruikt.

Bestaande DataRowState Waarden na Load methode en gebeurtenisactie
Toegevoegd Huidig = <bestaand>

Origineel = <Inkomend>

Status = <Gewijzigd>

RowAction = ChangeOriginal
Gemodificeerd Huidig = <bestaand>

Origineel = <Inkomend>

Status = <Gewijzigd>

RowAction = ChangeOriginal
Verwijderd Huidig = <Niet beschikbaar>

Origineel = <Inkomend>

Status = <Verwijderd>

RowAction = ChangeOriginal
Ongewijzigd Huidig = <Inkomend>

Origineel = <Inkomend>

Status = <Ongewijzigd>

RowAction = ChangeCurrentAndOriginal
(Niet aanwezig) Huidig = <Inkomend>

Origineel = <Inkomend>

Status = <Ongewijzigd>

RowAction = ChangeCurrentAndOriginal

Waarden in een DataColumn kunnen worden beperkt door het gebruik van eigenschappen zoals ReadOnly en AutoIncrement. De Load methode verwerkt dergelijke kolommen op een manier die consistent is met het gedrag dat is gedefinieerd door de eigenschappen van de kolom. De beperking alleen-lezen op een DataColumn is alleen van toepassing op wijzigingen die zich in het geheugen voordoen. De Load methode overschrijft indien nodig de alleen-lezen kolomwaarden.

Om te bepalen welke versie van het primaire-sleutelveld moet worden gebruikt voor het vergelijken van de huidige rij met een binnenkomende rij, gebruikt de Load methode de oorspronkelijke versie van de primaire-sleutelwaarde binnen een rij, als deze bestaat. Anders gebruikt de Load methode de huidige versie van het primaire-sleutelveld.

Zie ook

Van toepassing op

Load(IDataReader, LoadOption)

Vult een DataTable met waarden uit een gegevensbron op met behulp van de opgegeven IDataReader. Als de DataTable al rijen bevat, worden de binnenkomende gegevens uit de gegevensbron samengevoegd met de bestaande rijen op basis van de waarde van de loadOption parameter.

public:
 void Load(System::Data::IDataReader ^ reader, System::Data::LoadOption loadOption);
public void Load(System.Data.IDataReader reader, System.Data.LoadOption loadOption);
member this.Load : System.Data.IDataReader * System.Data.LoadOption -> unit
Public Sub Load (reader As IDataReader, loadOption As LoadOption)

Parameters

reader
IDataReader

Een IDataReader met een of meer resultatensets.

loadOption
LoadOption

Een waarde uit de LoadOption opsomming die aangeeft hoe rijen die zich al in de DataTable rijen bevinden, worden gecombineerd met binnenkomende rijen die dezelfde primaire sleutel delen.

Voorbeelden

In het volgende voorbeeld ziet u een aantal problemen met betrekking tot het aanroepen van de Load methode. Ten eerste richt het voorbeeld zich op schemaproblemen, waaronder het uitstellen van een schema uit de geladen IDataReaderschema's en het verwerken van incompatibele schema's en schema's met ontbrekende of aanvullende kolommen. Het voorbeeld richt zich vervolgens op gegevensproblemen, waaronder het verwerken van de verschillende laadopties.

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);
}
Sub Main()
  Dim table As New DataTable()

  ' This example examines a number of scenarios involving the
  '  DataTable.Load method.
  Console.WriteLine("Load a DataTable and infer its schema:")

  ' Retrieve a data reader, based on the Customers data. In
  ' an application, this data might be coming from a middle-tier
  ' business object:
  Dim reader As New DataTableReader(GetCustomers())

  ' The table has no schema. The Load method will infer the 
  ' schema from the IDataReader:
  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 ex As Exception
    Console.WriteLine(ex.GetType.Name & ":" & ex.Message())
  End Try

  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()
End Sub

Private Sub DisplayRowState(ByVal table As DataTable)
  For i As Integer = 0 To table.Rows.Count - 1
    Dim current As Object = "--"
    Dim original As Object = "--"
    Dim rowState As DataRowState = table.Rows(i).RowState

    ' Attempt to retrieve the current value, which doesn't exist
    ' for deleted rows:
    If rowState <> DataRowState.Deleted Then
      current = table.Rows(i)("Name", DataRowVersion.Current)
    End If

    ' Attempt to retrieve the original value, which doesn't exist
    ' for added rows:
    If rowState <> DataRowState.Added Then
      original = table.Rows(i)("Name", DataRowVersion.Original)
    End If
    Console.WriteLine("{0}: {1}, {2} ({3})", i, _
      current, original, rowState)
  Next
End Sub

Private Function GetChangedCustomers() As DataTable
  ' Create sample Customers table.
  Dim table As New DataTable

  ' Create two columns, ID and Name.
  Dim idColumn As DataColumn = table.Columns.Add("ID", _
      GetType(Integer))
  table.Columns.Add("Name", GetType(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
End Function

Private Function GetCustomers() As DataTable
  ' Create sample Customers table.
  Dim table As New DataTable

  ' Create two columns, ID and Name.
  Dim idColumn As DataColumn = table.Columns.Add("ID", _
      GetType(Integer))
  table.Columns.Add("Name", GetType(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
End Function

Private Function GetIntegerTable() As DataTable
  ' Create sample table with a single Int32 column.
  Dim table As New DataTable

  Dim idColumn As DataColumn = table.Columns.Add("ID", _
      GetType(Integer))

  ' 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
End Function

Private Function GetStringTable() As DataTable
  ' Create sample table with a single String column.
  Dim table As New DataTable

  Dim idColumn As DataColumn = table.Columns.Add("ID", _
      GetType(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
End Function

Private Sub PerformDemo(ByVal optionForLoad As LoadOption)

  ' 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(" ============================= ")

  Dim table As DataTable = SetupModifiedRows()
  Dim reader As New DataTableReader(GetChangedCustomers())
  AddHandler table.RowChanging, New _
      DataRowChangeEventHandler(AddressOf HandleRowChanging)

  table.Load(reader, optionForLoad)
  Console.WriteLine()
  DisplayRowState(table)
End Sub

Private Sub PrintColumns( _
   ByVal table As DataTable)

  ' Loop through all the rows in the DataTableReader.
  For Each row As DataRow In table.Rows
    For Each col As DataColumn In table.Columns
      Console.Write(row(col).ToString() & " ")
    Next
    Console.WriteLine()
  Next
End Sub

Private Function SetupModifiedRows() As DataTable
  ' Fill a DataTable with customer info, and 
  ' then modify, delete, and add rows.

  Dim table As DataTable = 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()
  Dim row As DataRow = table.NewRow
  row("ID") = 3
  row("Name") = "Melony"
  table.Rows.Add(row)

  ' Note that the code doesn't call
  ' table.AcceptChanges()
  Return table
End Function

Private Sub HandleRowChanging(ByVal sender As Object, _
      ByVal e As System.Data.DataRowChangeEventArgs)
  Console.WriteLine( _
      "RowChanging event: ID = {0}, action = {1}", e.Row("ID"), e.Action)
End Sub

Opmerkingen

De Load methode verbruikt de eerste resultatenset van de geladen IDataReader, en na een geslaagde voltooiing stelt u de positie van de lezer in op de volgende resultatenset, indien van toepassing. Bij het converteren van gegevens gebruikt de Load methode dezelfde conversieregels als de Fill methode.

De Load methode moet rekening houden met drie specifieke problemen bij het laden van de gegevens van een IDataReader exemplaar: schema-, gegevens- en gebeurtenisbewerkingen. Wanneer u met het schema werkt, kan de Load methode voorwaarden tegenkomen, zoals beschreven in de volgende tabel. De schemabewerkingen vinden plaats voor alle geïmporteerde resultatensets, zelfs voor alle geïmporteerde resultatensets die geen gegevens bevatten.

Condition Gedrag
Het DataTable heeft geen schema. De Load methode leidt het schema af op basis van de resultatenset van de geïmporteerde IDataReader.
Het DataTable heeft een schema, maar is niet compatibel met het geladen schema. De Load methode genereert een uitzondering die overeenkomt met de specifieke fout die optreedt bij het laden van gegevens in het niet-compatibele schema.
De schema's zijn compatibel, maar het geladen schema van de resultatenset bevat kolommen die niet bestaan in de DataTable. Met Load de methode worden de extra kolommen aan DataTablehet schema toegevoegd. De methode genereert een uitzondering als overeenkomende kolommen in de DataTable en de geladen resultatenset niet compatibel zijn met de waarde. De methode haalt ook beperkingsgegevens op uit de resultatenset voor alle toegevoegde kolommen. Met uitzondering van de primaire-sleutelbeperking wordt deze beperkingsgegevens alleen gebruikt als de huidige DataTable geen kolommen bevat aan het begin van de belastingsbewerking.
De schema's zijn compatibel, maar het geladen schema van de resultatenset bevat minder kolommen dan het DataTable. Als een ontbrekende kolom een standaardwaarde heeft gedefinieerd of het gegevenstype van de kolom null is, kunnen de rijen worden toegevoegd door de Load methode, waarbij de standaardwaarde of null-waarde voor de ontbrekende kolom wordt vervangen. Als er geen standaardwaarde of null kan worden gebruikt, genereert de Load methode een uitzondering. Als er geen specifieke standaardwaarde is opgegeven, gebruikt de Load methode de null-waarde als de impliciete standaardwaarde.

Voordat u rekening houdt met het gedrag van de Load methode in termen van gegevensbewerkingen, moet u overwegen dat elke rij in een DataTable rij zowel de huidige waarde als de oorspronkelijke waarde voor elke kolom onderhoudt. Deze waarden kunnen gelijkwaardig zijn of kunnen afwijken als de gegevens in de rij zijn gewijzigd sinds het invullen van de DataTable. Zie Rijstatussen en rijversies voor meer informatie.

In deze methode-aanroep is de opgegeven LoadOption parameter van invloed op de verwerking van de binnenkomende gegevens. Hoe moet de methode Laden het laden van rijen met dezelfde primaire sleutel verwerken als bestaande rijen? Moet de huidige waarden, oorspronkelijke waarden of beide worden gewijzigd? Deze problemen en meer worden beheerd door de loadOption parameter.

Als de bestaande rij en de binnenkomende rij overeenkomende primaire-sleutelwaarden bevatten, wordt de rij verwerkt met de huidige rijstatuswaarde, anders wordt deze beschouwd als een nieuwe rij.

In termen van gebeurtenisbewerkingen vindt de RowChanging gebeurtenis plaats voordat elke rij wordt gewijzigd en vindt de RowChanged gebeurtenis plaats nadat elke rij is gewijzigd. In elk geval bevat de Action eigenschap van het DataRowChangeEventArgs exemplaar dat is doorgegeven aan de gebeurtenis-handler informatie over de specifieke actie die aan de gebeurtenis is gekoppeld. Deze actiewaarde varieert, afhankelijk van de status van de rij vóór de laadbewerking. In elk geval vinden beide gebeurtenissen plaats en is de actie voor elke gebeurtenis hetzelfde. De actie kan worden toegepast op de huidige of oorspronkelijke versie van elke rij, of beide, afhankelijk van de huidige rijstatus.

In de volgende tabel ziet u het gedrag voor de methode Laden wanneer deze wordt aangeroepen met elk van de LoadOption waarden en hoe de waarden met de rijstatus communiceren voor de rij die wordt geladen. De laatste rij (met het label ((Niet aanwezig)) beschrijft het gedrag voor binnenkomende rijen die niet overeenkomen met een bestaande rij. Elke cel in deze tabel beschrijft de huidige en oorspronkelijke waarde voor een veld in een rij, samen met de DataRowState waarde nadat de Load methode is voltooid.

Bestaande DataRowState Upsert OverschrijvenChanges PreserveChanges (standaardgedrag)
Toegevoegd Huidig = <Inkomend>

Origineel = -<Niet beschikbaar>

Status = <toegevoegd>

RowAction = Wijzigen
Huidig = <Inkomend>

Origineel = <Inkomend>

Status = <Ongewijzigd>

RowAction = ChangeCurrentAndOriginal
Huidig = <bestaand>

Origineel = <Inkomend>

Status = <Gewijzigd>

RowAction = ChangeOriginal
Gemodificeerd Huidig = <Inkomend>

Origineel = <bestaand>

Status = <Gewijzigd>

RowAction = Wijzigen
Huidig = <Inkomend>

Origineel = <Inkomend>

Status = <Ongewijzigd>

RowAction = ChangeCurrentAndOriginal
Huidig = <bestaand>

Origineel = <Inkomend>

Status = <Gewijzigd>

RowAction =ChangeOriginal
Verwijderd (Laden heeft geen invloed op verwijderde rijen)

Huidig = ---

Origineel = <bestaand>

Status = <Verwijderd>

(Nieuwe rij wordt toegevoegd met de volgende kenmerken)

Huidig = <Inkomend>

Origineel = <Niet beschikbaar>

Status = <toegevoegd>

RowAction = Toevoegen
Verwijderen ongedaan maken en

Huidig = <Inkomend>

Origineel = <Inkomend>

Status = <Ongewijzigd>

RowAction = ChangeCurrentAndOriginal
Huidig = <Niet beschikbaar>

Origineel = <Inkomend>

Status = <Verwijderd>

RowAction = ChangeOriginal
Ongewijzigd Huidig = <Inkomend>

Origineel = <bestaand>

Als de nieuwe waarde hetzelfde is als de bestaande waarde, dan

Status = <Ongewijzigd>

RowAction = Niets

Anders

Status = <Gewijzigd>

RowAction = Wijzigen
Huidig = <Inkomend>

Origineel = <Inkomend>

Status = <Ongewijzigd>

RowAction = ChangeCurrentAndOriginal
Huidig = <Inkomend>

Origineel = <Inkomend>

Status = <Ongewijzigd>

RowAction = ChangeCurrentAndOriginal
Niet aanwezig) Huidig = <Inkomend>

Origineel = <Niet beschikbaar>

Status = <toegevoegd>

RowAction = Toevoegen
Huidig = <Inkomend>

Origineel = <Inkomend>

Status = <Ongewijzigd>

RowAction = ChangeCurrentAndOriginal
Huidig = <Inkomend>

Origineel = <Inkomend>

Status = <Ongewijzigd>

RowAction = ChangeCurrentAndOriginal

Waarden in een DataColumn kunnen worden beperkt door het gebruik van eigenschappen zoals ReadOnly en AutoIncrement. De Load methode verwerkt dergelijke kolommen op een manier die consistent is met het gedrag dat is gedefinieerd door de eigenschappen van de kolom. De beperking alleen-lezen op een DataColumn is alleen van toepassing op wijzigingen die zich in het geheugen voordoen. De Load methode overschrijft indien nodig de alleen-lezen kolomwaarden.

Als u de opties OverwriteChanges of PreserveChanges opgeeft bij het aanroepen van de Load methode, wordt ervan uitgegaan dat de binnenkomende gegevens afkomstig zijn van de DataTableprimaire gegevensbron en de Gegevenstabel wijzigingen bijhoudt en de wijzigingen weer kan doorgeven aan de gegevensbron. Als u de optie Upsert selecteert, wordt ervan uitgegaan dat de gegevens afkomstig zijn van een van een secundaire gegevensbron, zoals gegevens die worden geleverd door een onderdeel in de middelste laag, mogelijk gewijzigd door een gebruiker. In dit geval is de veronderstelling dat het de bedoeling is om gegevens uit een of meer gegevensbronnen in de DataTablegegevensbronnen samen te voegen en de gegevens vervolgens mogelijk weer door te geven aan de primaire gegevensbron. De LoadOption parameter wordt gebruikt voor het bepalen van de specifieke versie van de rij die moet worden gebruikt voor de vergelijking van primaire sleutels. De onderstaande tabel bevat de details.

Optie Laden DataRow-versie die wordt gebruikt voor vergelijking van primaire sleutels
OverwriteChanges Oorspronkelijke versie, indien aanwezig, anders huidige versie
PreserveChanges Oorspronkelijke versie, indien aanwezig, anders huidige versie
Upsert Huidige versie, indien aanwezig, anders oorspronkelijke versie

Zie ook

Van toepassing op

Load(IDataReader, LoadOption, FillErrorEventHandler)

Vult een DataTable met waarden uit een gegevensbron met behulp van de opgegeven IDataReader met behulp van een gemachtigde voor foutafhandeling.

public:
 virtual void Load(System::Data::IDataReader ^ reader, System::Data::LoadOption loadOption, System::Data::FillErrorEventHandler ^ errorHandler);
public virtual void Load(System.Data.IDataReader reader, System.Data.LoadOption loadOption, System.Data.FillErrorEventHandler errorHandler);
abstract member Load : System.Data.IDataReader * System.Data.LoadOption * System.Data.FillErrorEventHandler -> unit
override this.Load : System.Data.IDataReader * System.Data.LoadOption * System.Data.FillErrorEventHandler -> unit
Public Overridable Sub Load (reader As IDataReader, loadOption As LoadOption, errorHandler As FillErrorEventHandler)

Parameters

reader
IDataReader

Een IDataReader die een resultatenset biedt.

loadOption
LoadOption

Een waarde uit de LoadOption opsomming die aangeeft hoe rijen die zich al in de DataTable rijen bevinden, worden gecombineerd met binnenkomende rijen die dezelfde primaire sleutel delen.

errorHandler
FillErrorEventHandler

Een FillErrorEventHandler gemachtigde die moet worden aangeroepen wanneer er een fout optreedt tijdens het laden van gegevens.

Voorbeelden

static void Main()
{
    // Attempt to load data from a data reader in which
    // the schema is incompatible with the current schema.
    // If you use exception handling, you won't get the chance
    // to examine each row, and each individual table,
    // as the Load method progresses.
    // By taking advantage of the FillErrorEventHandler delegate,
    // you can interact with the Load process as an error occurs,
    // attempting to fix the problem, or simply continuing or quitting
    // the Load process:
    DataTable table = GetIntegerTable();
    DataTableReader reader = new DataTableReader(GetStringTable());
    table.Load(reader, LoadOption.OverwriteChanges, FillErrorHandler);

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

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;
}

static void FillErrorHandler(object sender, FillErrorEventArgs e)
{
    // You can use the e.Errors value to determine exactly what
    // went wrong.
    if (e.Errors.GetType() == typeof(System.FormatException))
    {
        Console.WriteLine("Error when attempting to update the value: {0}",
            e.Values[0]);
    }

    // Setting e.Continue to True tells the Load
    // method to continue trying. Setting it to False
    // indicates that an error has occurred, and the
    // Load method raises the exception that got
    // you here.
    e.Continue = true;
}
Sub Main()
  Dim table As New DataTable()

  ' Attempt to load data from a data reader in which
  ' the schema is incompatible with the current schema.
  ' If you use exception handling, you won't get the chance
  ' to examine each row, and each individual table,
  ' as the Load method progresses.
  ' By taking advantage of the FillErrorEventHandler delegate,
  ' you can interact with the Load process as an error occurs,
  ' attempting to fix the problem, or simply continuing or quitting
  ' the Load process:
  table = GetIntegerTable()
  Dim reader As New DataTableReader(GetStringTable())
  table.Load(reader, LoadOption.OverwriteChanges, _
      AddressOf FillErrorHandler)

  Console.WriteLine("Press any key to continue.")
  Console.ReadKey()
End Sub

Private Sub FillErrorHandler(ByVal sender As Object, _
  ByVal e As FillErrorEventArgs)
  ' You can use the e.Errors value to determine exactly what
  ' went wrong.
  If e.Errors.GetType Is GetType(System.FormatException) Then
    Console.WriteLine("Error when attempting to update the value: {0}", _
      e.Values(0))
  End If

  ' Setting e.Continue to True tells the Load
  ' method to continue trying. Setting it to False
  ' indicates that an error has occurred, and the 
  ' Load method raises the exception that got 
  ' you here.
  e.Continue = True
End Sub

Private Function GetIntegerTable() As DataTable
  ' Create sample table with a single Int32 column.
  Dim table As New DataTable

  Dim idColumn As DataColumn = table.Columns.Add("ID", GetType(Integer))

  ' 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.TableName = "IntegerTable"
  table.AcceptChanges()
  Return table
End Function

Private Function GetStringTable() As DataTable
  ' Create sample table with a single String column.
  Dim table As New DataTable

  Dim idColumn As DataColumn = table.Columns.Add("ID", _
      GetType(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
End Function

Private Sub PrintColumns( _
   ByVal table As DataTable)

  ' Loop through all the rows in the DataTableReader.
  For Each row As DataRow In table.Rows
    For Each col As DataColumn In table.Columns
      Console.Write(row(col).ToString() & " ")
    Next
    Console.WriteLine()
  Next
End Sub

Opmerkingen

De Load methode verbruikt de eerste resultatenset van de geladen IDataReader, en na een geslaagde voltooiing stelt u de positie van de lezer in op de volgende resultatenset, indien van toepassing. Bij het converteren van gegevens gebruikt de Load methode dezelfde conversieregels als de DbDataAdapter.Fill methode.

De Load methode moet rekening houden met drie specifieke problemen bij het laden van de gegevens van een IDataReader exemplaar: schema-, gegevens- en gebeurtenisbewerkingen. Wanneer u met het schema werkt, kan de Load methode voorwaarden tegenkomen, zoals beschreven in de volgende tabel. De schemabewerkingen vinden plaats voor alle geïmporteerde resultatensets, zelfs voor alle geïmporteerde resultatensets die geen gegevens bevatten.

Condition Gedrag
Het DataTable heeft geen schema. De Load methode leidt het schema af op basis van de resultatenset van de geïmporteerde IDataReader.
Het DataTable heeft een schema, maar is niet compatibel met het geladen schema. De Load methode genereert een uitzondering die overeenkomt met de specifieke fout die optreedt bij het laden van gegevens in het niet-compatibele schema.
De schema's zijn compatibel, maar het geladen schema van de resultatenset bevat kolommen die niet bestaan in de DataTable. Met Load de methode worden de extra kolommen aan DataTablehet schema toegevoegd. De methode genereert een uitzondering als overeenkomende kolommen in de DataTable en de geladen resultatenset niet compatibel zijn met de waarde. De methode haalt ook beperkingsgegevens op uit de resultatenset voor alle toegevoegde kolommen. Met uitzondering van de primaire-sleutelbeperking wordt deze beperkingsgegevens alleen gebruikt als de huidige DataTable geen kolommen bevat aan het begin van de belastingsbewerking.
De schema's zijn compatibel, maar het geladen schema van de resultatenset bevat minder kolommen dan het DataTable. Als een ontbrekende kolom een standaardwaarde heeft gedefinieerd of het gegevenstype van de kolom null is, kunnen de rijen worden toegevoegd door de Load methode, waarbij de standaardwaarde of null-waarde voor de ontbrekende kolom wordt vervangen. Als er geen standaardwaarde of null kan worden gebruikt, genereert de Load methode een uitzondering. Als er geen specifieke standaardwaarde is opgegeven, gebruikt de Load methode de null-waarde als de impliciete standaardwaarde.

Voordat u rekening houdt met het gedrag van de Load methode in termen van gegevensbewerkingen, moet u overwegen dat elke rij in een DataTable rij zowel de huidige waarde als de oorspronkelijke waarde voor elke kolom onderhoudt. Deze waarden kunnen gelijkwaardig zijn of kunnen afwijken als de gegevens in de rij zijn gewijzigd sinds het invullen van de DataTable. Zie Rijstatussen en rijversies voor meer informatie.

In deze methode-aanroep is de opgegeven LoadOption parameter van invloed op de verwerking van de binnenkomende gegevens. Hoe moet de methode Laden het laden van rijen met dezelfde primaire sleutel verwerken als bestaande rijen? Moet de huidige waarden, oorspronkelijke waarden of beide worden gewijzigd? Deze problemen en meer worden beheerd door de loadOption parameter.

Als de bestaande rij en de binnenkomende rij overeenkomende primaire-sleutelwaarden bevatten, wordt de rij verwerkt met de huidige rijstatuswaarde, anders wordt deze beschouwd als een nieuwe rij.

In termen van gebeurtenisbewerkingen vindt de RowChanging gebeurtenis plaats voordat elke rij wordt gewijzigd en vindt de RowChanged gebeurtenis plaats nadat elke rij is gewijzigd. In elk geval bevat de Action eigenschap van het DataRowChangeEventArgs exemplaar dat is doorgegeven aan de gebeurtenis-handler informatie over de specifieke actie die aan de gebeurtenis is gekoppeld. Deze actiewaarde varieert, afhankelijk van de status van de rij vóór de laadbewerking. In elk geval vinden beide gebeurtenissen plaats en is de actie voor elke gebeurtenis hetzelfde. De actie kan worden toegepast op de huidige of oorspronkelijke versie van elke rij, of beide, afhankelijk van de huidige rijstatus.

In de volgende tabel ziet u het gedrag voor de methode Laden wanneer deze wordt aangeroepen met elk van de LoadOption waarden en hoe de waarden met de rijstatus communiceren voor de rij die wordt geladen. De laatste rij (met het label ((Niet aanwezig)) beschrijft het gedrag voor binnenkomende rijen die niet overeenkomen met een bestaande rij. Elke cel in deze tabel beschrijft de huidige en oorspronkelijke waarde voor een veld in een rij, samen met de DataRowState waarde nadat de Load methode is voltooid.

Bestaande DataRowState Upsert OverschrijvenChanges PreserveChanges (standaardgedrag)
Toegevoegd Huidig = <Inkomend>

Origineel = -<Niet beschikbaar>

Status = <toegevoegd>

RowAction = Wijzigen
Huidig = <Inkomend>

Origineel = <Inkomend>

Status = <Ongewijzigd>

RowAction = ChangeCurrentAndOriginal
Huidig = <bestaand>

Origineel = <Inkomend>

Status = <Gewijzigd>

RowAction = ChangeOriginal
Gemodificeerd Huidig = <Inkomend>

Origineel = <bestaand>

Status = <Gewijzigd>

RowAction = Wijzigen
Huidig = <Inkomend>

Origineel = <Inkomend>

Status = <Ongewijzigd>

RowAction = ChangeCurrentAndOriginal
Huidig = <bestaand>

Origineel = <Inkomend>

Status = <Gewijzigd>

RowAction =ChangeOriginal
verwijderd (Laden heeft geen invloed op verwijderde rijen)

Huidig = ---

Origineel = <bestaand>

Status = <Verwijderd>

(Nieuwe rij wordt toegevoegd met de volgende kenmerken)

Huidig = <Inkomend>

Origineel = <Niet beschikbaar>

Status = <toegevoegd>

RowAction = Toevoegen
Verwijderen ongedaan maken en

Huidig = <Inkomend>

Origineel = <Inkomend>

Status = <Ongewijzigd>

RowAction = ChangeCurrentAndOriginal
Huidig = <Niet beschikbaar>

Origineel = <Inkomend>

Status = <Verwijderd>

RowAction = ChangeOriginal
Ongewijzigd Huidig = <Inkomend>

Origineel = <bestaand>

Als de nieuwe waarde hetzelfde is als de bestaande waarde, dan

Status = <Ongewijzigd>

RowAction = Niets

Anders

Status = <Gewijzigd>

RowAction = Wijzigen
Huidig = <Inkomend>

Origineel = <Inkomend>

Status = <Ongewijzigd>

RowAction = ChangeCurrentAndOriginal
Huidig = <Inkomend>

Origineel = <Inkomend>

Status = <Ongewijzigd>

RowAction = ChangeCurrentAndOriginal
Niet aanwezig) Huidig = <Inkomend>

Origineel = <Niet beschikbaar>

Status = <toegevoegd>

RowAction = Toevoegen
Huidig = <Inkomend>

Origineel = <Inkomend>

Status = <Ongewijzigd>

RowAction = ChangeCurrentAndOriginal
Huidig = <Inkomend>

Origineel = <Inkomend>

Status = <Ongewijzigd>

RowAction = ChangeCurrentAndOriginal

Waarden in een DataColumn kunnen worden beperkt door het gebruik van eigenschappen zoals ReadOnly en AutoIncrement. De Load methode verwerkt dergelijke kolommen op een manier die consistent is met het gedrag dat is gedefinieerd door de eigenschappen van de kolom. De beperking alleen-lezen op een DataColumn is alleen van toepassing op wijzigingen die zich in het geheugen voordoen. De Load methode overschrijft indien nodig de alleen-lezen kolomwaarden.

Als u de opties OverwriteChanges of PreserveChanges opgeeft bij het aanroepen van de Load methode, wordt ervan uitgegaan dat de binnenkomende gegevens afkomstig zijn van de DataTableprimaire gegevensbron en de Gegevenstabel wijzigingen bijhoudt en de wijzigingen weer kan doorgeven aan de gegevensbron. Als u de optie Upsert selecteert, wordt ervan uitgegaan dat de gegevens afkomstig zijn van een van een secundaire gegevensbron, zoals gegevens die worden geleverd door een onderdeel in de middelste laag, mogelijk gewijzigd door een gebruiker. In dit geval is de veronderstelling dat het de bedoeling is om gegevens uit een of meer gegevensbronnen in de DataTablegegevensbronnen samen te voegen en de gegevens vervolgens mogelijk weer door te geven aan de primaire gegevensbron. De LoadOption parameter wordt gebruikt voor het bepalen van de specifieke versie van de rij die moet worden gebruikt voor de vergelijking van primaire sleutels. De onderstaande tabel bevat de details.

Optie Laden DataRow-versie die wordt gebruikt voor vergelijking van primaire sleutels
OverwriteChanges Oorspronkelijke versie, indien aanwezig, anders huidige versie
PreserveChanges Oorspronkelijke versie, indien aanwezig, anders huidige versie
Upsert Huidige versie, indien aanwezig, anders oorspronkelijke versie

De errorHandler parameter is een FillErrorEventHandler gemachtigde die verwijst naar een procedure die wordt aangeroepen wanneer er een fout optreedt tijdens het laden van gegevens. De FillErrorEventArgs parameter die aan de procedure wordt doorgegeven, bevat eigenschappen waarmee u informatie kunt ophalen over de fout die is opgetreden, de huidige rij met gegevens en de DataTable ingevulde gegevens. Met behulp van dit gedelegeerde mechanisme, in plaats van een eenvoudiger try/catch-blok, kunt u de fout bepalen, de situatie afhandelen en doorgaan met verwerken als u wilt. De FillErrorEventArgs parameter levert een Continue eigenschap: stel deze eigenschap in om true aan te geven dat u de fout hebt verwerkt en de verwerking wilt voortzetten. Stel de eigenschap in om false aan te geven dat u de verwerking wilt stoppen. Houd er rekening mee dat het instellen van de eigenschap ervoor false zorgt dat de code die het probleem heeft veroorzaakt, een uitzondering genereert.

Zie ook

Van toepassing op