DataTable.Load DataTable.Load DataTable.Load DataTable.Load Method

Определение

Заполняет таблицу DataTable значениями из источника данных с помощью предоставляемого объекта IDataReader.Fills a DataTable with values from a data source using the supplied IDataReader. Если объект DataTable уже содержит строки, входящие данные из источника данных объединяются с существующими строками.If the DataTable already contains rows, the incoming data from the data source is merged with the existing rows.

Перегрузки

Load(IDataReader) Load(IDataReader) Load(IDataReader) Load(IDataReader)

Заполняет таблицу DataTable значениями из источника данных с помощью предоставляемого объекта IDataReader.Fills a DataTable with values from a data source using the supplied IDataReader. Если объект DataTable уже содержит строки, входящие данные из источника данных объединяются с существующими строками.If the DataTable already contains rows, the incoming data from the data source is merged with the existing rows.

Load(IDataReader, LoadOption) Load(IDataReader, LoadOption) Load(IDataReader, LoadOption)

Заполняет таблицу DataTable значениями из источника данных с помощью предоставляемого объекта IDataReader.Fills a DataTable with values from a data source using the supplied IDataReader. Если объект DataTable уже содержит строки, поступающие данные из источника данных объединяются с существующими строками согласно значению параметра loadOption.If the DataTable already contains rows, the incoming data from the data source is merged with the existing rows according to the value of the loadOption parameter.

Load(IDataReader, LoadOption, FillErrorEventHandler) Load(IDataReader, LoadOption, FillErrorEventHandler) Load(IDataReader, LoadOption, FillErrorEventHandler)

Заполняет таблицу DataTable значениями из источника данных с помощью предоставляемого объекта IDataReader, использующего делегат для обработки ошибок.Fills a DataTable with values from a data source using the supplied IDataReader using an error-handling delegate.

Примеры

В следующем примере показано несколько вопросов, связанных с вызовом Load метод.The following example demonstrates several of the issues involved with calling the Load method. Во-первых, пример рассматриваются вопросы схемы, включая получение схемы из загруженного IDataReader, а затем на обработке несовместимых схем и схем с отсутствующими или дополнительными столбцами.First, the example focuses on schema issues, including inferring a schema from the loaded IDataReader, and then handling incompatible schemas, and schemas with missing or additional columns. Пример затем рассматриваются вопросы данных, включая обработку различных параметров загрузки.The example then focuses on data issues, including handling the various loading options.

Примечание

В этом примере показано, как использовать один из перегруженных версий Load.This example shows how to use one of the overloaded versions of Load. Другие примеры, которые могут быть доступны см. в разделах отдельные перегрузки.For other examples that might be available, see the individual overload topics.

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

Комментарии

Load Метод может использоваться в ряде распространенных ситуаций, все направлены на получение данных из указанного источника данных и добавив его в текущем контейнере данных (в этом случае DataTable).The Load method can be used in several common scenarios, all centered around getting data from a specified data source and adding it to the current data container (in this case, a DataTable). В следующих сценариях описано стандартное использование для DataTable, описывающий его обновления и поведение объединения.These scenarios describe standard usage for a DataTable, describing its update and merge behavior.

Объект DataTable синхронизирует или обновление с одного основного источника данных.A DataTable synchronizes or updates with a single primary data source. DataTable Отслеживает изменения, позволяя синхронизация с основным источником данных.The DataTable tracks changes, allowing synchronization with the primary data source. Кроме того DataTable может принимать добавочные данные из одного или нескольких источников данных-получателя.In addition, a DataTable can accept incremental data from one or more secondary data sources. DataTable Не несет ответственность за отслеживание изменений, чтобы разрешить синхронизацию с помощью дополнительного источника данных.The DataTable isn't responsible for tracking changes in order to allow synchronization with the secondary data source.

Учитывая эти два гипотетические источника данных, пользователь скорее всего, потребуется одна из следующих ситуаций:Given these two hypothetical data sources, a user is likely to require one of the following behaviors:

  • Инициализировать DataTable из основного источника данных.Initialize DataTable from a primary data source. В этом случае пользователю необходимо инициализировать пустой DataTable значениями из первичного источника данных.In this scenario, the user wants to initialize an empty DataTable with values from the primary data source. Позже пользователь планирует распространить изменения обратно в основной источник данных.Later the user intends to propagate changes back to the primary data source.

  • Сохранение изменений и повторная синхронизация из первичного источника данных.Preserve changes and re-synchronize from the primary data source. В этом случае пользователь хочет воспользоваться DataTable заполнения в предыдущем сценарии и выполнять добавочную синхронизацию с основным источником данных, сохраняя изменения, сделанные в DataTable.In this scenario, the user wants to take the DataTable filled in the previous scenario and perform an incremental synchronization with the primary data source, preserving modifications made in the DataTable.

  • Веб-канал добавочные данные из дополнительных источников данных.Incremental data feed from secondary data sources. В этом сценарии пользователь хочет объединить изменения из одной или нескольких вторичных источников данных и распространить эти изменения обратно в основной источник данных.In this scenario, the user wants to merge changes from one or more secondary data sources, and propagate those changes back to the primary data source.

Load Метод делает возможным всех этих сценариях.The Load method makes all these scenarios possible. Только один из перегрузок этого метода можно указать параметр варианта загрузки, что означает, как строки, уже находящиеся DataTable эмоцию загружаемых строк.All but one of the overloads for this method allows you to specify a load option parameter, indicating how rows already in a DataTable combine with rows being loaded. (Перегрузка, которая не позволяет указать поведение использует вариант загрузки по умолчанию). В следующей таблице описаны три варианта загрузки, предоставляемые LoadOption перечисления.(The overload that doesn't allow you to specify the behavior uses the default load option.) The following table describes the three load options provided by the LoadOption enumeration. В каждом случае описание указывает поведение, когда первичный ключ строки во входных данных с первичным ключом существующей строки.In each case, the description indicates the behavior when the primary key of a row in the incoming data matches the primary key of an existing row.

Параметр загрузкиLoad Option ОписаниеDescription
PreserveChanges (по умолчанию)PreserveChanges (default) Обновляет исходную версию строки со значением входной строки.Updates the original version of the row with the value of the incoming row.
OverwriteChanges Обновляет текущие и исходные версии строки со значением входной строки.Updates the current and original versions of the row with the value of the incoming row.
Upsert Обновляет текущую версию строки со значением входной строки.Updates the current version of the row with the value of the incoming row.

В общем случае PreserveChanges и OverwriteChanges параметры предназначены для сценариев, в которых пользователю необходимо синхронизировать DataSet и его изменения с основным источником данных.In general, the PreserveChanges and OverwriteChanges options are intended for scenarios in which the user needs to synchronize the DataSet and its changes with the primary data source. Upsert Параметр облегчает сбор изменений из одного или нескольких источников данных-получателя.The Upsert option facilitates aggregating changes from one or more secondary data sources.

Load(IDataReader) Load(IDataReader) Load(IDataReader) Load(IDataReader)

Заполняет таблицу DataTable значениями из источника данных с помощью предоставляемого объекта IDataReader.Fills a DataTable with values from a data source using the supplied IDataReader. Если объект DataTable уже содержит строки, входящие данные из источника данных объединяются с существующими строками.If the DataTable already contains rows, the incoming data from the data source is merged with the existing rows.

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)

Параметры

reader
IDataReader IDataReader IDataReader IDataReader

Объект IDataReader, предоставляющий набор результатов.An IDataReader that provides a result set.

Примеры

В следующем примере показано несколько вопросов, связанных с вызовом Load метод.The following example demonstrates several of the issues involved with calling the Load method. Во-первых, пример рассматриваются вопросы схемы, включая получение схемы из загруженного IDataReader, а затем на обработке несовместимых схем и схем с отсутствующими или дополнительными столбцами.First, the example focuses on schema issues, including inferring a schema from the loaded IDataReader, and then handling incompatible schemas, and schemas with missing or additional columns. Затем в примере вызывается Load метод, отображающий данные до и после операции загрузки.The example then calls the Load method, displaying the data both before and after the load operation.

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

Комментарии

Load Метод использует первый результирующий набор из загруженного IDataReaderи после успешного завершения задает положение средства чтения к следующему результирующему набору, если таковой имеется.The Load method consumes the first result set from the loaded IDataReader, and after successful completion, sets the reader's position to the next result set, if any. При преобразовании данных, Load метод использует те же правила преобразования как DbDataAdapter.Fill метод.When converting data, the Load method uses the same conversion rules as the DbDataAdapter.Fill method.

Load Метод должен принимать во внимание три конкретные проблемы при загрузке данных из IDataReader экземпляр: операции схем, данных и событий.The Load method must take into account three specific issues when loading the data from an IDataReader instance: schema, data, and event operations. При работе со схемой, Load метода могут возникнуть условия, как описано в следующей таблице.When working with the schema, the Load method may encounter conditions as described in the following table. Операций схемы выполняются для всех импортированных результирующих наборов, даже не содержащих данных.The schema operations take place for all imported result sets, even those containing no data.

УсловиеCondition ПоведениеBehavior
DataTable Не имеет схемы.The DataTable has no schema. Load Метод определяет схему, в зависимости от результирующего набора из импортированного IDataReader.The Load method infers the schema based on the result set from the imported IDataReader.
DataTable Имеет схему, но он не совместим с схема загружена.The DataTable has a schema, but it is incompatible with the loaded schema. Load Метод вызывает исключение, соответствующей конкретной ошибки, возникающее при попытке загрузить данные в несовместимую схему.The Load method throws an exception corresponding to the particular error that occurs when attempting to load data into the incompatible schema.
Схемы совместимы, но схема загруженного набора результатов содержит столбцы, которые не существуют в DataTable.The schemas are compatible, but the loaded result set schema contains columns that do not exist in the DataTable. Load Метод добавляет дополнительные столбцы в DataTableэлемента схемы.The Load method adds the extra columns to DataTable's schema. Метод вызывает исключение, если соответствующие столбцы в DataTable и загрузить результирующий набор не совместимы.The method throws an exception if corresponding columns in the DataTable and the loaded result set are not value compatible. Этот метод также извлекает сведения об ограничениях в результирующем наборе для всех добавленных столбцов.The method also retrieves constraint information from the result set for all added columns. За исключением в случае ограничения Primary Key, эта информация ограничение используется только в том случае, если текущий DataTable не содержит все столбцы в начале операции загрузки.Except for the case of Primary Key constraint, this constraint information is used only if the current DataTable does not contain any columns at the start of the load operation.
Схемы совместимы, но схема загруженного набора результатов содержит меньше столбцов, чем DataTable.The schemas are compatible, but the loaded result set schema contains fewer columns than does the DataTable. Если отсутствующий столбец имеет определенное значение по умолчанию или тип данных столбца, допускающего значение NULL, Load метод позволяет строки должен быть добавлен, заменив значение по умолчанию или null значение в столбце отсутствует.If a missing column has a default value defined or the column's data type is nullable, the Load method allows the rows to be added, substituting the default or null value for the missing column. Если нет значения по умолчанию или null можно использовать, а затем Load метод вызывает исключение.If no default value or null can be used, then the Load method throws an exception. Если указано значение определенного по умолчанию отсутствует, Load использует метод null значение в качестве значения по умолчанию подразумеваемых.If no specific default value has been supplied, the Load method uses the null value as the implied default value.

Прежде чем анализировать поведение Load метод с точки зрения операций с данными, обратите внимание на каждой строки в пределах DataTable сохраняет текущее значение и исходное значение для каждого столбца.Before considering the behavior of the Load method in terms of data operations, consider that each row within a DataTable maintains both the current value and the original value for each column. Эти значения могут быть эквивалентны, или может отличаться, если данные в строке были изменены с момента заполнения DataTable.These values may be equivalent, or may be different if the data in the row has been changed since filling the DataTable. Дополнительные сведения см. в разделе строки состояния и версии строк.For more information, see Row States and Row Versions.

Эта версия Load метод пытается сохранить текущие значения в каждой строке, в котором не затрагиваются исходное значение.This version of the Load method attempts to preserve the current values in each row, leaving the original value intact. (Если требуется детальный контроль над поведением входящих данных, см. в разделе DataTable.Load.) Если существующая строка и входная строка содержит соответствующие значения первичного ключа, строка обрабатывается с помощью его текущее значение строки состояния, в противном случае она обрабатывается как новой строки.(If you want finer control over the behavior of incoming data, see DataTable.Load.) If the existing row and the incoming row contain corresponding primary key values, the row is processed using its current row state value, otherwise it's treated as a new row.

С точки зрения операций событий RowChanging событие происходит перед каждой строки изменяется и RowChanged событие возникает после изменения каждой строки.In terms of event operations, the RowChanging event occurs before each row is changed, and the RowChanged event occurs after each row has been changed. В каждом случае Action свойство DataRowChangeEventArgs экземпляр, переданный в обработчик событий содержит сведения о конкретного действия, связанного с событием.In each case, the Action property of the DataRowChangeEventArgs instance passed to the event handler contains information about the particular action associated with the event. Значение этого действия зависит от состояния строки до операции загрузки.This action value depends on the state of the row before the load operation. В каждом случае оба события возникают и всех действии.In each case, both events occur, and the action is the same for each. Действие может применяться к текущей или исходной версии каждой строки, или оба из них, в зависимости от состояния текущей строки.The action may be applied to either the current or original version of each row, or both, depending on the current row state.

В следующей таблице показаны поведение для Load метод.The following table displays behavior for the Load method. Последняя строка (с меткой "(отсутствует)») описывается поведение для входящих строк, которые не соответствуют любой существующей строки.The final row (labeled "(Not present)") describes the behavior for incoming rows that don't match any existing row. Каждая ячейка в этой таблице описывает текущее и исходное значение для поля в строке, вместе с DataRowState для значения после Load завершения метода.Each cell in this table describes the current and original value for a field within a row, along with the DataRowState for the value after the Load method has completed. В этом случае метод не позволяет указать параметр загрузки и использует значение по умолчанию PreserveChanges.In this case, the method doesn't allow you to indicate the load option, and uses the default, PreserveChanges.

Существующие DataRowStateExisting DataRowState Значения после Load метод и действие событияValues after Load method, and event action
AddedAdded Текущий = <существующие >Current = <Existing>

Исходный = <входящих >Original = <Incoming>

Состояние = <изменения >State = <Modified>

RowAction = ChangeOriginalRowAction = ChangeOriginal
ИзмененоModified Текущий = <существующие >Current = <Existing>

Исходный = <входящих >Original = <Incoming>

Состояние = <изменения >State = <Modified>

RowAction = ChangeOriginalRowAction = ChangeOriginal
DeletedDeleted Текущий = <недоступно >Current = <Not available>

Исходный = <входящих >Original = <Incoming>

Состояние = <удален >State = <Deleted>

RowAction = ChangeOriginalRowAction = ChangeOriginal
UnchangedUnchanged Текущий = <входящих >Current = <Incoming>

Исходный = <входящих >Original = <Incoming>

Состояние = <без изменений >State = <Unchanged>

RowAction = ChangeCurrentAndOriginalRowAction = ChangeCurrentAndOriginal
(Отсутствует)(Not present) Текущий = <входящих >Current = <Incoming>

Исходный = <входящих >Original = <Incoming>

Состояние = <без изменений >State = <Unchanged>

RowAction = ChangeCurrentAndOriginalRowAction = ChangeCurrentAndOriginal

Значения в DataColumn может быть ограничена путем использования свойства таких как ReadOnly и AutoIncrement.Values in a DataColumn can be constrained through use of properties such as ReadOnly and AutoIncrement. Load Метод обрабатывает такие столбцы способом, который согласуется с поведением, определяются свойствами столбца.The Load method handles such columns in a manner that is consistent with the behavior defined by the column's properties. Чтение Единственное ограничение на DataColumn применимо только для изменений, произошедших в памяти.The read only constraint on a DataColumn is applicable only for changes that occur in memory. Load Метода перезаписывает значения столбца только для чтения, при необходимости.The Load method's overwrites the read-only column values, if needed.

Чтобы определить, какую версию следует использовать для сравнения текущей строки с входящей строки, поле первичного ключа Load метод использует исходную версию значения первичного ключа в строке, если он существует.To determine which version of the primary key field to use for comparing the current row with an incoming row, the Load method uses the original version of the primary key value within a row, if it exists. В противном случае Load метод использует текущую версию поле первичного ключа.Otherwise, the Load method uses the current version of the primary key field.

Дополнительно

Load(IDataReader, LoadOption) Load(IDataReader, LoadOption) Load(IDataReader, LoadOption)

Заполняет таблицу DataTable значениями из источника данных с помощью предоставляемого объекта IDataReader.Fills a DataTable with values from a data source using the supplied IDataReader. Если объект DataTable уже содержит строки, поступающие данные из источника данных объединяются с существующими строками согласно значению параметра loadOption.If the DataTable already contains rows, the incoming data from the data source is merged with the existing rows according to the value of the 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

Параметры

reader
IDataReader IDataReader IDataReader IDataReader

Объект IDataReader, предоставляющий один или несколько наборов результатов.An IDataReader that provides one or more result sets.

loadOption
LoadOption LoadOption LoadOption LoadOption

Значение из перечисления LoadOption, которое показывает способ комбинирования строк, уже находящихся в таблице DataTable, с поступающими строками, которые совместно используют один и тот же первичный ключ.A value from the LoadOption enumeration that indicates how rows already in the DataTable are combined with incoming rows that share the same primary key.

Примеры

В следующем примере показано несколько вопросов, связанных с вызовом Load метод.The following example demonstrates several of the issues involved with calling the Load method. Во-первых, пример рассматриваются вопросы схемы, включая получение схемы из загруженного IDataReader, а затем на обработке несовместимых схем и схем с отсутствующими или дополнительными столбцами.First, the example focuses on schema issues, including inferring a schema from the loaded IDataReader, and then handling incompatible schemas, and schemas with missing or additional columns. Пример затем рассматриваются вопросы данных, включая обработку различных параметров загрузки.The example then focuses on data issues, including handling the various loading options.

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

Комментарии

Load Метод использует первый результирующий набор из загруженного IDataReaderи после успешного завершения задает положение средства чтения к следующему результирующему набору, если таковой имеется.The Load method consumes the first result set from the loaded IDataReader, and after successful completion, sets the reader's position to the next result set, if any. При преобразовании данных, Load метод использует те же правила преобразования как Fill метод.When converting data, the Load method uses the same conversion rules as the Fill method.

Load Метод должен принимать во внимание три конкретные проблемы при загрузке данных из IDataReader экземпляр: операции схем, данных и событий.The Load method must take into account three specific issues when loading the data from an IDataReader instance: schema, data, and event operations. При работе со схемой, Load метода могут возникнуть условия, как описано в следующей таблице.When working with the schema, the Load method may encounter conditions as described in the following table. Операций схемы выполняются для всех импортированных результирующих наборов, даже не содержащих данных.The schema operations take place for all imported result sets, even those containing no data.

УсловиеCondition ПоведениеBehavior
DataTable Не имеет схемы.The DataTable has no schema. Load Метод определяет схему, в зависимости от результирующего набора из импортированного IDataReader.The Load method infers the schema based on the result set from the imported IDataReader.
DataTable Имеет схему, но он не совместим с схема загружена.The DataTable has a schema, but it is incompatible with the loaded schema. Load Метод вызывает исключение, соответствующей конкретной ошибки, возникающее при попытке загрузить данные в несовместимую схему.The Load method throws an exception corresponding to the particular error that occurs when attempting to load data into the incompatible schema.
Схемы совместимы, но схема загруженного набора результатов содержит столбцы, которые не существуют в DataTable.The schemas are compatible, but the loaded result set schema contains columns that don't exist in the DataTable. Load Метод добавляет дополнительные столбцы в DataTableэлемента схемы.The Load method adds the extra columns to DataTable's schema. Метод вызывает исключение, если соответствующие столбцы в DataTable и загрузить результирующий набор не совместимы.The method throws an exception if corresponding columns in the DataTable and the loaded result set are not value compatible. Этот метод также извлекает сведения об ограничениях в результирующем наборе для всех добавленных столбцов.The method also retrieves constraint information from the result set for all added columns. За исключением в случае ограничения Primary Key, эта информация ограничение используется только в том случае, если текущий DataTable не содержит все столбцы в начале операции загрузки.Except for the case of Primary Key constraint, this constraint information is used only if the current DataTable does not contain any columns at the start of the load operation.
Схемы совместимы, но схема загруженного набора результатов содержит меньше столбцов, чем DataTable.The schemas are compatible, but the loaded result set schema contains fewer columns than does the DataTable. Если отсутствующий столбец имеет определенное значение по умолчанию или тип данных столбца, допускающего значение NULL, Load метод позволяет строки должен быть добавлен, замещая значение по умолчанию или значение null для отсутствующего столбца.If a missing column has a default value defined or the column's data type is nullable, the Load method allows the rows to be added, substituting the default or null value for the missing column. Если используется не значение по умолчанию или значение null, то Load метод вызывает исключение.If no default value or null can be used, then the Load method throws an exception. Если указано значение определенного по умолчанию отсутствует, Load метод использует значение null как значение по умолчанию подразумеваемых.If no specific default value has been supplied, the Load method uses the null value as the implied default value.

Прежде чем анализировать поведение Load метод с точки зрения операций с данными, обратите внимание на каждой строки в пределах DataTable сохраняет текущее значение и исходное значение для каждого столбца.Before considering the behavior of the Load method in terms of data operations, consider that each row within a DataTable maintains both the current value and the original value for each column. Эти значения могут быть эквивалентны, или может отличаться, если данные в строке были изменены с момента заполнения DataTable.These values may be equivalent, or may be different if the data in the row has been changed since filling the DataTable. См. в разделе строки состояния и версии строк Дополнительные сведения.See Row States and Row Versions for more information.

При таком вызове метода, указанного LoadOption параметр влияет на обработку входящих данных.In this method call, the specified LoadOption parameter influences the processing of the incoming data. Как метод Load должна обрабатывать загрузку строк, имеющих тот же первичный ключ, как и существующие строки?How should the Load method handle loading rows that have the same primary key as existing rows? Должен ли он изменять текущие значения и исходные значения?Should it modify current values, original values, or both? Эти проблемы и многое другое, управляются loadOption параметра.These issues, and more, are controlled by the loadOption parameter.

Если существующая строка и входная строка содержит соответствующие значения первичного ключа, строка обрабатывается с помощью его текущее значение строки состояния, в противном случае она обрабатывается как новой строки.If the existing row and the incoming row contain corresponding primary key values, the row is processed using its current row state value, otherwise it's treated as a new row.

С точки зрения операций событий RowChanging событие происходит перед каждой строки изменяется и RowChanged событие возникает после изменения каждой строки.In terms of event operations, the RowChanging event occurs before each row is changed, and the RowChanged event occurs after each row has been changed. В каждом случае Action свойство DataRowChangeEventArgs экземпляр, переданный в обработчик событий содержит сведения о конкретного действия, связанного с событием.In each case, the Action property of the DataRowChangeEventArgs instance passed to the event handler contains information about the particular action associated with the event. Значение этого действия зависит от состояния строки до операции загрузки.This action value varies, depending on the state of the row before the load operation. В каждом случае оба события возникают и всех действии.In each case, both events occur, and the action is the same for each. Действие может применяться к текущей или исходной версии каждой строки, или оба из них, в зависимости от состояния текущей строки.The action may be applied to either the current or original version of each row, or both, depending on the current row state.

В следующей таблице показаны поведение метода Load при вызове с каждым из LoadOption значений, а также показано, как значения взаимодействуют с состоянием загружаемой строки.The following table displays behavior for the Load method when called with each of the LoadOption values, and also shows how the values interact with the row state for the row being loaded. Последняя строка (с меткой "(отсутствует)») описывается поведение для входящих строк, которые не соответствуют любой существующей строки.The final row (labeled "(Not present)") describes the behavior for incoming rows that don't match any existing row. Каждая ячейка в этой таблице описывает текущее и исходное значение для поля в строке, вместе с DataRowState для значения после Load завершения метода.Each cell in this table describes the current and original value for a field within a row, along with the DataRowState for the value after the Load method has completed.

Существующие DataRowStateExisting DataRowState UpsertUpsert OverwriteChangesOverwriteChanges PreserveChanges (поведение по умолчанию)PreserveChanges (Default behavior)
AddedAdded Текущий = <входящих >Current = <Incoming>

Исходный = -<недоступно >Original = -<Not available>

Состояние = <добавлены >State = <Added>

RowAction = изменениеRowAction = Change
Текущий = <входящих >Current = <Incoming>

Исходный = <входящих >Original = <Incoming>

Состояние = <без изменений >State = <Unchanged>

RowAction = ChangeCurrentAndOriginalRowAction = ChangeCurrentAndOriginal
Текущий = <существующие >Current = <Existing>

Исходный = <входящих >Original = <Incoming>

Состояние = <изменения >State = <Modified>

RowAction = ChangeOriginalRowAction = ChangeOriginal
ИзмененоModified Текущий = <входящих >Current = <Incoming>

Исходный = <существующие >Original = <Existing>

Состояние = <изменения >State = <Modified>

RowAction = изменениеRowAction = Change
Текущий = <входящих >Current = <Incoming>

Исходный = <входящих >Original = <Incoming>

Состояние = <без изменений >State = <Unchanged>

RowAction = ChangeCurrentAndOriginalRowAction = ChangeCurrentAndOriginal
Текущий = <существующие >Current = <Existing>

Исходный = <входящих >Original = <Incoming>

Состояние = <изменения >State = <Modified>

RowAction = ChangeOriginalRowAction =ChangeOriginal
DeletedDeleted (Нагрузки не влияет на удаленные строки)(Load does not affect deleted rows)

Текущий =---Current = ---

Исходный = <существующие >Original = <Existing>

Состояние = <удален >State = <Deleted>

(Со следующими характеристиками добавляется новая строка)(New row is added with the following characteristics)

Текущий = <входящих >Current = <Incoming>

Исходный = <недоступно >Original = <Not available>

Состояние = <добавлены >State = <Added>

RowAction = добавитьRowAction = Add
Отменить удаление иUndo delete and

Текущий = <входящих >Current = <Incoming>

Исходный = <входящих >Original = <Incoming>

Состояние = <без изменений >State = <Unchanged>

RowAction = ChangeCurrentAndOriginalRowAction = ChangeCurrentAndOriginal
Текущий = <недоступно >Current = <Not available>

Исходный = <входящих >Original = <Incoming>

Состояние = <удален >State = <Deleted>

RowAction = ChangeOriginalRowAction = ChangeOriginal
UnchangedUnchanged Текущий = <входящих >Current = <Incoming>

Исходный = <существующие >Original = <Existing>

Если новое значение будет таким же, как существующее значениеIf new value is the same as the existing value then

Состояние = <без изменений >State = <Unchanged>

RowAction = NothingRowAction = Nothing

ELSEElse

Состояние = <изменения >State = <Modified>

RowAction = изменениеRowAction = Change
Текущий = <входящих >Current = <Incoming>

Исходный = <входящих >Original = <Incoming>

Состояние = <без изменений >State = <Unchanged>

RowAction = ChangeCurrentAndOriginalRowAction = ChangeCurrentAndOriginal
Текущий = <входящих >Current = <Incoming>

Исходный = <входящих >Original = <Incoming>

Состояние = <без изменений >State = <Unchanged>

RowAction = ChangeCurrentAndOriginalRowAction = ChangeCurrentAndOriginal
Отсутствует)Not present) Текущий = <входящих >Current = <Incoming>

Исходный = <недоступно >Original = <Not available>

Состояние = <добавлены >State = <Added>

RowAction = добавитьRowAction = Add
Текущий = <входящих >Current = <Incoming>

Исходный = <входящих >Original = <Incoming>

Состояние = <без изменений >State = <Unchanged>

RowAction = ChangeCurrentAndOriginalRowAction = ChangeCurrentAndOriginal
Текущий = <входящих >Current = <Incoming>

Исходный = <входящих >Original = <Incoming>

Состояние = <без изменений >State = <Unchanged>

RowAction = ChangeCurrentAndOriginalRowAction = ChangeCurrentAndOriginal

Значения в DataColumn может быть ограничена путем использования свойства таких как ReadOnly и AutoIncrement.Values in a DataColumn can be constrained through use of properties such as ReadOnly and AutoIncrement. Load Метод обрабатывает такие столбцы способом, который согласуется с поведением, определяются свойствами столбца.The Load method handles such columns in a manner that is consistent with the behavior defined by the column's properties. Чтение Единственное ограничение на DataColumn применимо только для изменений, произошедших в памяти.The read only constraint on a DataColumn is applicable only for changes that occur in memory. Load Метода перезаписывает значения столбца только для чтения, при необходимости.The Load method's overwrites the read-only column values, if needed.

Если указать параметры OverwriteChanges или PreserveChanges при вызове Load метод, то предполагается выполняется что данные поступают из DataTableв первичный источник данных, а объект DataTable отслеживает изменения и можно распространить изменения в источнике данных.If you specify the OverwriteChanges or PreserveChanges options when calling the Load method, then the assumption is made that the incoming data is coming from the DataTable's primary data source, and the DataTable tracks changes and can propagate the changes back to the data source. Если выбран параметр Upsert, предполагается, что данные поступают из одного из вторичного источника данных, таких как данные, предоставляемые компонентом среднего уровня, быть изменены пользователем.If you select the Upsert option, it is assumed that the data is coming from one of a secondary data source, such as data provided by a middle-tier component, perhaps altered by a user. В этом случае предполагается, что цель состоит в сборе данных из одного или нескольких источников данных в DataTable, а затем данные могут распространяться обратно в основной источник данных.In this case, the assumption is that the intent is to aggregate data from one or more data sources in the DataTable, and then perhaps propagate the data back to the primary data source. LoadOption Параметр используется для определения конкретной версии строки, которая будет использоваться для сравнения первичных ключей.The LoadOption parameter is used for determining the specific version of the row that is to be used for primary key comparison. В таблице ниже сведения.The table below provides the details.

Параметр загрузкиLoad option Версия DataRow, используемая для сравнения первичных ключейDataRow version used for primary key comparison
OverwriteChanges Исходная версия, если он существует, в противном случае текущая версияOriginal version, if it exists, otherwise Current version
PreserveChanges Исходная версия, если он существует, в противном случае текущая версияOriginal version, if it exists, otherwise Current version
Upsert Текущая версия, если он существует, в противном случае исходная версияCurrent version, if it exists, otherwise Original version
Дополнительно

Load(IDataReader, LoadOption, FillErrorEventHandler) Load(IDataReader, LoadOption, FillErrorEventHandler) Load(IDataReader, LoadOption, FillErrorEventHandler)

Заполняет таблицу DataTable значениями из источника данных с помощью предоставляемого объекта IDataReader, использующего делегат для обработки ошибок.Fills a DataTable with values from a data source using the supplied IDataReader using an error-handling delegate.

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

Параметры

reader
IDataReader IDataReader IDataReader IDataReader

Объект IDataReader, предоставляющий набор результатов.A IDataReader that provides a result set.

loadOption
LoadOption LoadOption LoadOption LoadOption

Значение из перечисления LoadOption, которое показывает способ комбинирования строк, уже находящихся в таблице DataTable, с поступающими строками, которые совместно используют один и тот же первичный ключ.A value from the LoadOption enumeration that indicates how rows already in the DataTable are combined with incoming rows that share the same primary key.

errorHandler
FillErrorEventHandler FillErrorEventHandler FillErrorEventHandler FillErrorEventHandler

Делегат FillErrorEventHandler, вызываемый при возникновении ошибки во время загрузки данных.A FillErrorEventHandler delegate to call when an error occurs while loading data.

Примеры

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

Комментарии

Load Метод использует первый результирующий набор из загруженного IDataReaderи после успешного завершения задает положение средства чтения к следующему результирующему набору, если таковой имеется.The Load method consumes the first result set from the loaded IDataReader, and after successful completion, sets the reader's position to the next result set, if any. При преобразовании данных, Load метод использует те же правила преобразования как DbDataAdapter.Fill метод.When converting data, the Load method uses the same conversion rules as the DbDataAdapter.Fill method.

Load Метод должен принимать во внимание три конкретные проблемы при загрузке данных из IDataReader экземпляр: операции схем, данных и событий.The Load method must take into account three specific issues when loading the data from an IDataReader instance: schema, data, and event operations. При работе со схемой, Load метода могут возникнуть условия, как описано в следующей таблице.When working with the schema, the Load method may encounter conditions as described in the following table. Операций схемы выполняются для всех импортированных результирующих наборов, даже не содержащих данных.The schema operations take place for all imported result sets, even those containing no data.

УсловиеCondition ПоведениеBehavior
DataTable Не имеет схемы.The DataTable has no schema. Load Метод определяет схему, в зависимости от результирующего набора из импортированного IDataReader.The Load method infers the schema based on the result set from the imported IDataReader.
DataTable Имеет схему, но он не совместим с схема загружена.The DataTable has a schema, but it is incompatible with the loaded schema. Load Метод вызывает исключение, соответствующей конкретной ошибки, возникающее при попытке загрузить данные в несовместимую схему.The Load method throws an exception corresponding to the particular error that occurs when attempting to load data into the incompatible schema.
Схемы совместимы, но схема загруженного набора результатов содержит столбцы, которые не существуют в DataTable.The schemas are compatible, but the loaded result set schema contains columns that don't exist in the DataTable. Load Метод добавляет дополнительные столбцы для DataTableэлемента схемы.The Load method adds the extra column(s) to DataTable's schema. Метод вызывает исключение, если соответствующие столбцы в DataTable и загрузить результирующий набор не совместимы.The method throws an exception if corresponding columns in the DataTable and the loaded result set are not value compatible. Этот метод также извлекает сведения об ограничениях в результирующем наборе для всех добавленных столбцов.The method also retrieves constraint information from the result set for all added columns. За исключением в случае ограничения Primary Key, эта информация ограничение используется только в том случае, если текущий DataTable не содержит все столбцы в начале операции загрузки.Except for the case of Primary Key constraint, this constraint information is used only if the current DataTable does not contain any columns at the start of the load operation.
Схемы совместимы, но схема загруженного набора результатов содержит меньше столбцов, чем DataTable.The schemas are compatible, but the loaded result set schema contains fewer columns than does the DataTable. Если отсутствующий столбец имеет определенное значение по умолчанию или тип данных столбца, допускающего значение NULL, Load метод позволяет строки должен быть добавлен, замещая значение по умолчанию или значение null для отсутствующего столбца.If a missing column has a default value defined or the column's data type is nullable, the Load method allows the rows to be added, substituting the default or null value for the missing column. Если используется не значение по умолчанию или значение null, то Load метод вызывает исключение.If no default value or null can be used, then the Load method throws an exception. Если указано значение определенного по умолчанию отсутствует, Load метод использует значение null как значение по умолчанию подразумеваемых.If no specific default value has been supplied, the Load method uses the null value as the implied default value.

Прежде чем анализировать поведение Load метод с точки зрения операций с данными, обратите внимание на каждой строки в пределах DataTable сохраняет текущее значение и исходное значение для каждого столбца.Before considering the behavior of the Load method in terms of data operations, consider that each row within a DataTable maintains both the current value and the original value for each column. Эти значения могут быть эквивалентны, или может отличаться, если данные в строке были изменены с момента заполнения DataTable.These values may be equivalent, or may be different if the data in the row has been changed since filling the DataTable. См. в разделе строки состояния и версии строк Дополнительные сведения.See Row States and Row Versions for more information.

При таком вызове метода, указанного LoadOption параметр влияет на обработку входящих данных.In this method call, the specified LoadOption parameter influences the processing of the incoming data. Как метод Load должна обрабатывать загрузку строк, имеющих тот же первичный ключ, как и существующие строки?How should the Load method handle loading rows that have the same primary key as existing rows? Должен ли он изменять текущие значения и исходные значения?Should it modify current values, original values, or both? Эти проблемы и многое другое, управляются loadOption параметра.These issues, and more, are controlled by the loadOption parameter.

Если существующая строка и входная строка содержит соответствующие значения первичного ключа, строка обрабатывается с помощью его текущее значение строки состояния, в противном случае она обрабатывается как новой строки.If the existing row and the incoming row contain corresponding primary key values, the row is processed using its current row state value, otherwise it's treated as a new row.

С точки зрения операций событий RowChanging событие происходит перед каждой строки изменяется и RowChanged событие возникает после изменения каждой строки.In terms of event operations, the RowChanging event occurs before each row is changed, and the RowChanged event occurs after each row has been changed. В каждом случае Action свойство DataRowChangeEventArgs экземпляр, переданный в обработчик событий содержит сведения о конкретного действия, связанного с событием.In each case, the Action property of the DataRowChangeEventArgs instance passed to the event handler contains information about the particular action associated with the event. Значение этого действия зависит от состояния строки до операции загрузки.This action value varies, depending on the state of the row before the load operation. В каждом случае оба события возникают и всех действии.In each case, both events occur, and the action is the same for each. Действие может применяться к текущей или исходной версии каждой строки, или оба из них, в зависимости от состояния текущей строки.The action may be applied to either the current or original version of each row, or both, depending on the current row state.

В следующей таблице показаны поведение метода Load при вызове с каждым из LoadOption значений, а также показано, как значения взаимодействуют с состоянием загружаемой строки.The following table displays behavior for the Load method when called with each of the LoadOption values, and also shows how the values interact with the row state for the row being loaded. Последняя строка (с меткой "(отсутствует)») описывается поведение для входящих строк, которые не соответствуют любой существующей строки.The final row (labeled "(Not present)") describes the behavior for incoming rows that don't match any existing row. Каждая ячейка в этой таблице описывает текущее и исходное значение для поля в строке, вместе с DataRowState для значения после Load завершения метода.Each cell in this table describes the current and original value for a field within a row, along with the DataRowState for the value after the Load method has completed.

Существующие DataRowStateExisting DataRowState UpsertUpsert OverwriteChangesOverwriteChanges PreserveChanges (поведение по умолчанию)PreserveChanges (Default behavior)
AddedAdded Текущий = <входящих >Current = <Incoming>

Исходный = -<недоступно >Original = -<Not available>

Состояние = <добавлены >State = <Added>

RowAction = изменениеRowAction = Change
Текущий = <входящих >Current = <Incoming>

Исходный = <входящих >Original = <Incoming>

Состояние = <без изменений >State = <Unchanged>

RowAction = ChangeCurrentAndOriginalRowAction = ChangeCurrentAndOriginal
Текущий = <существующие >Current = <Existing>

Исходный = <входящих >Original = <Incoming>

Состояние = <изменения >State = <Modified>

RowAction = ChangeOriginalRowAction = ChangeOriginal
ИзмененоModified Текущий = <входящих >Current = <Incoming>

Исходный = <существующие >Original = <Existing>

Состояние = <изменения >State = <Modified>

RowAction = изменениеRowAction = Change
Текущий = <входящих >Current = <Incoming>

Исходный = <входящих >Original = <Incoming>

Состояние = <без изменений >State = <Unchanged>

RowAction = ChangeCurrentAndOriginalRowAction = ChangeCurrentAndOriginal
Текущий = <существующие >Current = <Existing>

Исходный = <входящих >Original = <Incoming>

Состояние = <изменения >State = <Modified>

RowAction = ChangeOriginalRowAction =ChangeOriginal
аленныйeleted (Нагрузки не влияет на удаленные строки)(Load does not affect deleted rows)

Текущий =---Current = ---

Исходный = <существующие >Original = <Existing>

Состояние = <удален >State = <Deleted>

(Со следующими характеристиками добавляется новая строка)(New row is added with the following characteristics)

Текущий = <входящих >Current = <Incoming>

Исходный = <недоступно >Original = <Not available>

Состояние = <добавлены >State = <Added>

RowAction = добавитьRowAction = Add
Отменить удаление иUndo delete and

Текущий = <входящих >Current = <Incoming>

Исходный = <входящих >Original = <Incoming>

Состояние = <без изменений >State = <Unchanged>

RowAction = ChangeCurrentAndOriginalRowAction = ChangeCurrentAndOriginal
Текущий = <недоступно >Current = <Not available>

Исходный = <входящих >Original = <Incoming>

Состояние = <удален >State = <Deleted>

RowAction = ChangeOriginalRowAction = ChangeOriginal
UnchangedUnchanged Текущий = <входящих >Current = <Incoming>

Исходный = <существующие >Original = <Existing>

Если новое значение будет таким же, как существующее значениеIf new value is the same as the existing value then

Состояние = <без изменений >State = <Unchanged>

RowAction = NothingRowAction = Nothing

ELSEElse

Состояние = <изменения >State = <Modified>

RowAction = изменениеRowAction = Change
Текущий = <входящих >Current = <Incoming>

Исходный = <входящих >Original = <Incoming>

Состояние = <без изменений >State = <Unchanged>

RowAction = ChangeCurrentAndOriginalRowAction = ChangeCurrentAndOriginal
Текущий = <входящих >Current = <Incoming>

Исходный = <входящих >Original = <Incoming>

Состояние = <без изменений >State = <Unchanged>

RowAction = ChangeCurrentAndOriginalRowAction = ChangeCurrentAndOriginal
Отсутствует)Not present) Текущий = <входящих >Current = <Incoming>

Исходный = <недоступно >Original = <Not available>

Состояние = <добавлены >State = <Added>

RowAction = добавитьRowAction = Add
Текущий = <входящих >Current = <Incoming>

Исходный = <входящих >Original = <Incoming>

Состояние = <без изменений >State = <Unchanged>

RowAction = ChangeCurrentAndOriginalRowAction = ChangeCurrentAndOriginal
Текущий = <входящих >Current = <Incoming>

Исходный = <входящих >Original = <Incoming>

Состояние = <без изменений >State = <Unchanged>

RowAction = ChangeCurrentAndOriginalRowAction = ChangeCurrentAndOriginal

Значения в DataColumn может быть ограничена путем использования свойства таких как ReadOnly и AutoIncrement.Values in a DataColumn can be constrained through use of properties such as ReadOnly and AutoIncrement. Load Метод обрабатывает такие столбцы способом, который согласуется с поведением, определяются свойствами столбца.The Load method handles such columns in a manner that is consistent with the behavior defined by the column's properties. Чтение Единственное ограничение на DataColumn применимо только для изменений, произошедших в памяти.The read only constraint on a DataColumn is applicable only for changes that occur in memory. Load Метода перезаписывает значения столбца только для чтения, при необходимости.The Load method's overwrites the read-only column values, if needed.

Если указать параметры OverwriteChanges или PreserveChanges при вызове Load метод, то предполагается выполняется что данные поступают из DataTableв первичный источник данных, а объект DataTable отслеживает изменения и можно распространить изменения в источнике данных.If you specify the OverwriteChanges or PreserveChanges options when calling the Load method, then the assumption is made that the incoming data is coming from the DataTable's primary data source, and the DataTable tracks changes and can propagate the changes back to the data source. Если выбран параметр Upsert, предполагается, что данные поступают из одного из вторичного источника данных, таких как данные, предоставляемые компонентом среднего уровня, быть изменены пользователем.If you select the Upsert option, it is assumed that the data is coming from one of a secondary data source, such as data provided by a middle-tier component, perhaps altered by a user. В этом случае предполагается, что цель состоит в сборе данных из одного или нескольких источников данных в DataTable, а затем данные могут распространяться обратно в основной источник данных.In this case, the assumption is that the intent is to aggregate data from one or more data sources in the DataTable, and then perhaps propagate the data back to the primary data source. LoadOption Параметр используется для определения конкретной версии строки, которая будет использоваться для сравнения первичных ключей.The LoadOption parameter is used for determining the specific version of the row that is to be used for primary key comparison. В таблице ниже сведения.The table below provides the details.

Параметр загрузкиLoad option Версия DataRow, используемая для сравнения первичных ключейDataRow version used for primary key comparison
OverwriteChanges Исходная версия, если он существует, в противном случае текущая версияOriginal version, if it exists, otherwise Current version
PreserveChanges Исходная версия, если он существует, в противном случае текущая версияOriginal version, if it exists, otherwise Current version
Upsert Текущая версия, если он существует, в противном случае исходная версияCurrent version, if it exists, otherwise Original version

errorHandler Параметр FillErrorEventHandler делегат, который ссылается на процедуру, которая вызывается при возникновении ошибки во время загрузки данных.The errorHandler parameter is a FillErrorEventHandler delegate that refers to a procedure that is called when an error occurs while loading data. FillErrorEventArgs Параметра, передаваемые в процедуру предоставляет свойства, которые позволяют получить сведения об ошибке, которая произошла, текущей строке данных, и DataTable заполнения.The FillErrorEventArgs parameter passed to the procedure provides properties that allow you to retrieve information about the error that occurred, the current row of data, and the DataTable being filled. С помощью этого механизма делегата, вместо простой блок try/catch, позволяет определить ошибки, обрабатывать ситуации и продолжить обработку при необходимости.Using this delegate mechanism, rather than a simpler try/catch block, allows you to determine the error, handle the situation, and continue processing if you like. FillErrorEventArgs Параметр предоставляет Continue свойство: присвойте этому свойству значение true для указания, что ошибка была обработана и продолжить обработку.The FillErrorEventArgs parameter supplies a Continue property: set this property to true to indicate that you have handled the error and wish to continue processing. Присвойте свойству false для указания, что вы хотите остановить процесс.Set the property to false to indicate that you wish to halt processing. Имейте в виду, что свойству присвоено значение false вызывает код, источником проблемы для создания исключения.Be aware that setting the property to false causes the code that triggered the problem to throw an exception.

Дополнительно

Применяется к