DataTable.Load Метод

Определение

Заполняет таблицу DataTable значениями из источника данных с помощью предоставляемого объекта IDataReader. Если объект DataTable уже содержит строки, входящие данные из источника данных объединяются с существующими строками.

Перегрузки

Load(IDataReader)

Заполняет таблицу DataTable значениями из источника данных с помощью предоставляемого объекта IDataReader. Если объект DataTable уже содержит строки, входящие данные из источника данных объединяются с существующими строками.

Load(IDataReader, LoadOption)

Заполняет таблицу DataTable значениями из источника данных с помощью предоставляемого объекта IDataReader. Если объект DataTable уже содержит строки, поступающие данные из источника данных объединяются с существующими строками согласно значению параметра loadOption.

Load(IDataReader, LoadOption, FillErrorEventHandler)

Заполняет таблицу DataTable значениями из источника данных с помощью предоставляемого объекта IDataReader, использующего делегат для обработки ошибок.

Примеры

В следующем примере показано несколько проблем, связанных с вызовом Load метода . Сначала в этом примере рассматриваются проблемы со схемой, включая вывод схемы из загруженного IDataReaderобъекта , а затем обработку несовместимых схем и схем с отсутствующими или дополнительными столбцами. Затем в этом примере рассматриваются проблемы с данными, включая обработку различных параметров загрузки.

Примечание

В этом примере показано, как использовать одну из перегруженных версий Load. Другие примеры, которые могут быть доступны, см. в разделах об отдельных перегрузках.

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 Эти сценарии описывают стандартное DataTableиспользование для , описывая его обновление и слияние.

Объект DataTable синхронизирует или обновляется с одним первичным источником данных. Отслеживает DataTable изменения, обеспечивая синхронизацию с основным источником данных. Кроме того, DataTable может принимать добавочные данные из одного или нескольких вторичных источников данных. Не DataTable отвечает за отслеживание изменений, чтобы разрешить синхронизацию со вторичным источником данных.

Учитывая эти два гипотетических источника данных, пользователю, скорее всего, потребуется одно из следующих действий:

  • Инициализация DataTable из первичного источника данных. В этом сценарии пользователь хочет инициализировать пустой DataTable объект значениями из основного источника данных. Позже пользователь намерен распространить изменения обратно в основной источник данных.

  • Сохранение изменений и повторная синхронизация из основного источника данных. В этом сценарии пользователь хочет принять DataTable заполненное в предыдущем сценарии и выполнить добавочную синхронизацию с основным источником данных, сохранив изменения, внесенные DataTableв .

  • Добавочный веб-канал данных из дополнительных источников данных. В этом сценарии пользователь хочет объединить изменения из одного или нескольких вторичных источников данных и распространить эти изменения обратно в основной источник данных.

Метод Load делает возможными все эти сценарии. Все перегрузки, кроме одной, для этого метода позволяют указать параметр параметра загрузки, указывающий, как строки, уже существующие в , DataTable объединяются со строками, загружаемыми. (Перегрузка, которая не позволяет указать поведение, использует параметр загрузки по умолчанию.) В следующей таблице описаны три варианта загрузки, предоставляемые перечислением LoadOption . В каждом случае описание указывает поведение, когда первичный ключ строки во входящих данных совпадает с первичным ключом существующей строки.

Параметр загрузки Описание
PreserveChanges (по умолчанию) Обновления исходную версию строки со значением входящей строки.
OverwriteChanges Обновления текущую и исходную версии строки со значением входящей строки.
Upsert Обновления текущую версию строки со значением входящей строки.

Как правило, параметры и OverwriteChanges предназначены для сценариев, PreserveChanges в которых пользователю необходимо синхронизировать DataSet и его изменения с основным источником данных. Параметр Upsert упрощает агрегирование изменений из одного или нескольких вторичных источников данных.

Load(IDataReader)

Исходный код:
DataTable.cs
Исходный код:
DataTable.cs
Исходный код:
DataTable.cs

Заполняет таблицу DataTable значениями из источника данных с помощью предоставляемого объекта IDataReader. Если объект DataTable уже содержит строки, входящие данные из источника данных объединяются с существующими строками.

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, предоставляющий набор результатов.

Примеры

В следующем примере показано несколько проблем, связанных с вызовом Load метода . Сначала в этом примере рассматриваются проблемы со схемой, включая вывод схемы из загруженного IDataReaderобъекта , а затем обработку несовместимых схем и схем с отсутствующими или дополнительными столбцами. Затем в примере вызывается Load метод , отображающий данные как до, так и после операции загрузки.

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, а после успешного завершения задает позицию читателя следующим результирующим набором, если таковой есть. При преобразовании данных метод использует те же правила преобразования, Load что и DbDataAdapter.Fill метод .

Метод Load должен учитывать три конкретные проблемы при загрузке данных из экземпляра IDataReader : схема, данные и операции событий. При работе со схемой метод может столкнуться с условиями, Load описанными в следующей таблице. Операции схемы выполняются для всех импортированных результирующих наборов, даже для тех, которые не содержат данных.

Условие Поведение
Не DataTable имеет схемы. Метод Load выводит схему на основе результируемого набора из импортированного IDataReaderобъекта .
Имеет DataTable схему, но она несовместима с загруженной схемой. Метод Load создает исключение, соответствующее конкретной ошибке, которая возникает при попытке загрузить данные в несовместимую схему.
Схемы совместимы, но загруженная схема результирующих наборов содержит столбцы, которых нет в DataTable. Метод Load добавляет дополнительные столбцы в DataTableсхему . Метод создает исключение, если соответствующие столбцы в DataTable и загруженном результирующем наборе несовместимы со значениями. Метод также извлекает сведения об ограничении из результирующих наборов для всех добавленных столбцов. За исключением ограничения первичного ключа, эти сведения об ограничении используются только в том случае, если текущий DataTable элемент не содержит столбцов в начале операции загрузки.
Схемы совместимы, но загруженная схема результирующих наборов содержит меньше столбцов, чем DataTable. Если отсутствующий столбец имеет определенное значение по умолчанию или тип данных столбца допускает значение NULL, Load метод позволяет добавлять строки, заменяя отсутствующий столбец значением по умолчанию или null . Если значение по умолчанию не используется или null его можно использовать, метод Load создает исключение. Если конкретное значение по умолчанию не указано, Load метод использует значение в null качестве подразумеваемого значения по умолчанию.

Прежде чем рассматривать поведение Load метода с точки зрения операций с данными, следует учитывать, что каждая строка в DataTable объекте сохраняет текущее и исходное значение для каждого столбца. Эти значения могут быть эквивалентными или отличаться, если данные в строке были изменены с момента заполнения DataTable. Дополнительные сведения см. в разделе Состояния строк и версии строк.

Эта версия Load метода пытается сохранить текущие значения в каждой строке, оставляя исходное значение без изменений. (Если требуется более точное управление поведением входящих данных, см. раздел DataTable.Load.) Если существующая и входящая строки содержат соответствующие значения первичного ключа, строка обрабатывается с использованием текущего значения состояния строки, в противном случае она обрабатывается как новая строка.

С точки зрения операций событий RowChanging событие происходит до изменения каждой строки, а RowChanged событие возникает после изменения каждой строки. В каждом случае свойство экземпляраDataRowChangeEventArgs, передаваемое обработчику событий, содержит сведения о конкретном действии, Action связанном с событием. Это значение действия зависит от состояния строки перед операцией загрузки. В каждом случае происходят оба события, и действие одинаково для каждого из них. Действие может применяться к текущей или исходной версии каждой строки или к обеим в зависимости от состояния текущей строки.

В следующей таблице показано поведение метода Load . Последняя строка (с меткой "(Отсутствует)") описывает поведение входящих строк, которые не соответствуют ни одной существующей строке. Каждая ячейка в этой таблице описывает текущее и исходное значение для поля в строке DataRowState , а также значение для значения после Load завершения метода. В этом случае метод не позволяет указать параметр загрузки и использует значение по умолчанию . PreserveChanges

Существующий DataRowState Значения после Load метода и действие события
Добавлено Current = <Existing>

Original = <Входящие>

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

RowAction = ChangeOriginal
Изменен Current = <Existing>

Original = <Входящие>

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

RowAction = ChangeOriginal
Удаленная Current = <Недоступен>

Original = <Входящие>

Состояние = <Удалено>

RowAction = ChangeOriginal
Без изменений Current = <Входящие>

Original = <Входящие>

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

RowAction = ChangeCurrentAndOriginal
(Отсутствует) Current = <Входящие>

Original = <Входящие>

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

RowAction = ChangeCurrentAndOriginal

Значения в DataColumn можно ограничить с помощью таких свойств, как ReadOnly и AutoIncrement. Метод Load обрабатывает такие столбцы способом, который соответствует поведению, определенному свойствами столбца. Ограничение только для DataColumn чтения в применяется только к изменениям, происходящим в памяти. При Load необходимости метод перезаписывает значения столбцов, доступные только для чтения.

Чтобы определить, какую версию поля первичного ключа следует использовать для сравнения текущей строки с входящей строкой, Load метод использует исходную версию значения первичного ключа в строке, если она существует. В противном Load случае метод использует текущую версию поля первичного ключа.

См. также раздел

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

Load(IDataReader, LoadOption)

Исходный код:
DataTable.cs
Исходный код:
DataTable.cs
Исходный код:
DataTable.cs

Заполняет таблицу DataTable значениями из источника данных с помощью предоставляемого объекта IDataReader. Если объект DataTable уже содержит строки, поступающие данные из источника данных объединяются с существующими строками согласно значению параметра loadOption.

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

Параметры

reader
IDataReader

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

loadOption
LoadOption

Значение из перечисления LoadOption, которое показывает способ комбинирования строк, уже находящихся в таблице DataTable, с поступающими строками, которые совместно используют один и тот же первичный ключ.

Примеры

В следующем примере показано несколько проблем, связанных с вызовом Load метода . Сначала в этом примере рассматриваются проблемы со схемой, включая вывод схемы из загруженного IDataReaderобъекта , а затем обработку несовместимых схем и схем с отсутствующими или дополнительными столбцами. Затем в этом примере рассматриваются проблемы с данными, включая обработку различных параметров загрузки.

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и после успешного завершения задает позицию средства чтения в следующем результирующем наборе, если таковой есть. При преобразовании данных метод использует те же правила преобразования, Load что и Fill метод .

Метод Load должен учитывать три конкретные проблемы при загрузке данных из экземпляра IDataReader : схема, данные и операции с событиями. При работе со схемой метод может столкнуться с условиями, Load описанными в следующей таблице. Операции схемы выполняются для всех импортированных результирующих наборов, даже не содержащих данных.

Условие Поведение
Не DataTable имеет схемы. Метод Load выводит схему на основе результирующий набор из импортированного IDataReaderобъекта .
имеет DataTable схему, но несовместим с загруженной схемой. Метод Load создает исключение, соответствующее конкретной ошибке, которая возникает при попытке загрузить данные в несовместимую схему.
Схемы совместимы, но загруженная схема результирующих наборов содержит столбцы, которые не существуют в DataTable. Метод Load добавляет дополнительные столбцы в DataTableсхему . Метод создает исключение, если соответствующие столбцы в DataTable и загруженном результирующем наборе несовместимы со значениями. Метод также получает сведения об ограничении из результирующих наборов для всех добавленных столбцов. За исключением ограничения первичного ключа, сведения об этом ограничении используются только в том случае, если текущий DataTable элемент не содержит столбцов в начале операции загрузки.
Схемы совместимы, но загруженная схема результирующих наборов содержит меньше столбцов, чем DataTable. Если отсутствующий столбец имеет значение по умолчанию или тип данных столбца допускает значение NULL, Load метод позволяет добавлять строки, заменяя отсутствующий столбец значением по умолчанию или NULL. Если нельзя использовать значение по умолчанию или значение NULL, метод Load создает исключение. Если конкретное значение по умолчанию не указано, Load метод использует значение NULL в качестве подразумеваемого значения по умолчанию.

Прежде чем рассматривать поведение Load метода с точки зрения операций с данными, следует учесть, что каждая строка в DataTable содержит как текущее, так и исходное значение для каждого столбца. Эти значения могут быть эквивалентными или отличаться, если данные в строке были изменены с момента заполнения DataTable. Дополнительные сведения см. в разделе Состояния строк и версии строк .

В этом вызове метода указанный LoadOption параметр влияет на обработку входящих данных. Как метод Load должен обрабатывать загрузку строк, имеющих тот же первичный ключ, что и существующие строки? Следует ли изменять текущие, исходные значения или и то, и другое? Эти и другие проблемы управляются параметром loadOption .

Если существующая и входящая строка содержат соответствующие значения первичного ключа, строка обрабатывается с использованием текущего значения состояния строки, в противном случае она обрабатывается как новая строка.

С точки зрения операций с событиями событие RowChanging происходит до изменения каждой RowChanged строки, а событие — после изменения каждой строки. В каждом случае свойство экземпляраDataRowChangeEventArgs, переданное обработчику событий, содержит сведения о конкретном действии, Action связанном с событием. Это значение действия зависит от состояния строки перед операцией загрузки. В каждом случае происходят оба события, и действие одинаково для каждого из них. Действие может быть применено к текущей или исходной версии каждой строки или к обеим в зависимости от состояния текущей строки.

В следующей таблице показано поведение метода Load при вызове с каждым из LoadOption значений, а также показано, как значения взаимодействуют с состоянием строки для загружаемой строки. Последняя строка (с меткой "(Отсутствует)") описывает поведение входящих строк, которые не соответствуют ни одной существующей строке. Каждая ячейка в этой таблице описывает текущее и исходное значение для поля в строке DataRowState , а также значение для значения после Load завершения метода.

Существующий DataRowState Upsert OverwriteChanges PreserveChanges (поведение по умолчанию)
Добавлено Текущий = <входящий>

Original = -<Not available>

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

RowAction = Change
Текущий = <входящий>

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

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

RowAction = ChangeCurrentAndOriginal
Текущая = <существующая>

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

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

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

Original = <Existing>

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

RowAction = Change
Текущий = <входящий>

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

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

RowAction = ChangeCurrentAndOriginal
Текущая = <существующая>

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

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

RowAction =ChangeOriginal
Удаленная (Загрузка не влияет на удаленные строки)

Current = ---

Original = <Existing>

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

(Добавлена новая строка со следующими характеристиками)

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

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

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

RowAction = Add
Отмена удаления и

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

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

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

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

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

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

RowAction = ChangeOriginal
Без изменений Текущий = <входящий>

Original = <Existing>

Если новое значение совпадает с существующим, то

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

RowAction = Nothing

ELSE

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

RowAction = Change
Текущий = <входящий>

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

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

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

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

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

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

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

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

RowAction = Add
Текущий = <входящий>

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

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

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

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

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

RowAction = ChangeCurrentAndOriginal

Значения в DataColumn можно ограничить с помощью таких свойств, как ReadOnly и AutoIncrement. Метод Load обрабатывает такие столбцы в соответствии с поведением, определенным свойствами столбца. Ограничение только для DataColumn чтения для применяется только для изменений, происходящих в памяти. При Load необходимости метод перезаписывает значения столбцов, доступные только для чтения.

Если при вызове Load метода заданы параметры OverwriteChanges или PreserveChanges, то предполагается, что входящие данные поступают из основного DataTableисточника данных, а DataTable отслеживает изменения и может распространять изменения обратно в источник данных. При выборе параметра Upsert предполагается, что данные поступают из одного из дополнительных источников данных, например данных, предоставляемых компонентом среднего уровня, возможно, измененных пользователем. В этом случае предполагается, что целью является агрегировать данные из одного или нескольких источников данных в DataTable, а затем, возможно, распространить данные обратно в основной источник данных. Параметр LoadOption используется для определения конкретной версии строки, которая будет использоваться для сравнения первичного ключа. Подробные сведения приведены в таблице ниже.

Параметр загрузки Версия DataRow, используемая для сравнения первичного ключа
OverwriteChanges Исходная версия, если она существует, в противном случае — текущая версия
PreserveChanges Исходная версия, если она существует, в противном случае — текущая версия
Upsert Текущая версия, если она существует, в противном случае исходная версия

См. также раздел

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

Load(IDataReader, LoadOption, FillErrorEventHandler)

Исходный код:
DataTable.cs
Исходный код:
DataTable.cs
Исходный код:
DataTable.cs

Заполняет таблицу DataTable значениями из источника данных с помощью предоставляемого объекта IDataReader, использующего делегат для обработки ошибок.

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

Параметры

reader
IDataReader

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

loadOption
LoadOption

Значение из перечисления LoadOption, которое показывает способ комбинирования строк, уже находящихся в таблице DataTable, с поступающими строками, которые совместно используют один и тот же первичный ключ.

errorHandler
FillErrorEventHandler

Делегат FillErrorEventHandler, вызываемый при возникновении ошибки во время загрузки данных.

Примеры

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и после успешного завершения задает позицию средства чтения в следующем результирующем наборе, если таковой есть. При преобразовании данных метод использует те же правила преобразования, Load что и DbDataAdapter.Fill метод .

Метод Load должен учитывать три конкретные проблемы при загрузке данных из экземпляра IDataReader : схема, данные и операции с событиями. При работе со схемой метод может столкнуться с условиями, Load описанными в следующей таблице. Операции схемы выполняются для всех импортированных результирующих наборов, даже не содержащих данных.

Условие Поведение
Не DataTable имеет схемы. Метод Load выводит схему на основе результирующий набор из импортированного IDataReaderобъекта .
имеет DataTable схему, но несовместим с загруженной схемой. Метод Load создает исключение, соответствующее конкретной ошибке, которая возникает при попытке загрузить данные в несовместимую схему.
Схемы совместимы, но загруженная схема результирующих наборов содержит столбцы, которые не существуют в DataTable. Метод Load добавляет дополнительные столбцы в схему DataTable. Метод создает исключение, если соответствующие столбцы в DataTable и загруженном результирующем наборе несовместимы со значениями. Метод также получает сведения об ограничении из результирующих наборов для всех добавленных столбцов. За исключением ограничения первичного ключа, сведения об этом ограничении используются только в том случае, если текущий DataTable элемент не содержит столбцов в начале операции загрузки.
Схемы совместимы, но загруженная схема результирующих наборов содержит меньше столбцов, чем DataTable. Если отсутствующий столбец имеет значение по умолчанию или тип данных столбца допускает значение NULL, Load метод позволяет добавлять строки, заменяя отсутствующий столбец значением по умолчанию или NULL. Если нельзя использовать значение по умолчанию или значение NULL, метод Load создает исключение. Если конкретное значение по умолчанию не указано, Load метод использует значение NULL в качестве подразумеваемого значения по умолчанию.

Прежде чем рассматривать поведение Load метода с точки зрения операций с данными, следует учесть, что каждая строка в DataTable содержит как текущее, так и исходное значение для каждого столбца. Эти значения могут быть эквивалентными или отличаться, если данные в строке были изменены с момента заполнения DataTable. Дополнительные сведения см. в разделе Состояния строк и версии строк .

В этом вызове метода указанный LoadOption параметр влияет на обработку входящих данных. Как метод Load должен обрабатывать загрузку строк, имеющих тот же первичный ключ, что и существующие строки? Следует ли изменять текущие, исходные значения или и то, и другое? Эти и другие проблемы управляются параметром loadOption .

Если существующая и входящая строка содержат соответствующие значения первичного ключа, строка обрабатывается с использованием текущего значения состояния строки, в противном случае она обрабатывается как новая строка.

С точки зрения операций с событиями событие RowChanging происходит до изменения каждой RowChanged строки, а событие — после изменения каждой строки. В каждом случае свойство экземпляраDataRowChangeEventArgs, переданное обработчику событий, содержит сведения о конкретном действии, Action связанном с событием. Это значение действия зависит от состояния строки перед операцией загрузки. В каждом случае происходят оба события, и действие одинаково для каждого из них. Действие может быть применено к текущей или исходной версии каждой строки или к обеим в зависимости от состояния текущей строки.

В следующей таблице показано поведение метода Load при вызове с каждым из LoadOption значений, а также показано, как значения взаимодействуют с состоянием строки для загружаемой строки. Последняя строка (с меткой "(Отсутствует)") описывает поведение входящих строк, которые не соответствуют ни одной существующей строке. Каждая ячейка в этой таблице описывает текущее и исходное значение для поля в строке DataRowState , а также значение для значения после Load завершения метода.

Существующий DataRowState Upsert OverwriteChanges PreserveChanges (поведение по умолчанию)
Добавлено Текущий = <входящий>

Original = -<Not available>

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

RowAction = Change
Текущий = <входящий>

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

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

RowAction = ChangeCurrentAndOriginal
Текущая = <существующая>

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

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

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

Original = <Existing>

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

RowAction = Change
Текущий = <входящий>

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

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

RowAction = ChangeCurrentAndOriginal
Текущая = <существующая>

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

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

RowAction =ChangeOriginal
eleted (Загрузка не влияет на удаленные строки)

Current = ---

Original = <Existing>

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

(Добавлена новая строка со следующими характеристиками)

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

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

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

RowAction = Add
Отмена удаления и

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

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

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

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

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

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

RowAction = ChangeOriginal
Без изменений Текущий = <входящий>

Original = <Existing>

Если новое значение совпадает с существующим, то

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

RowAction = Nothing

ELSE

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

RowAction = Change
Текущий = <входящий>

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

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

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

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

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

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

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

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

RowAction = Add
Текущий = <входящий>

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

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

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

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

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

RowAction = ChangeCurrentAndOriginal

Значения в DataColumn можно ограничить с помощью таких свойств, как ReadOnly и AutoIncrement. Метод Load обрабатывает такие столбцы в соответствии с поведением, определенным свойствами столбца. Ограничение только для DataColumn чтения для применяется только для изменений, происходящих в памяти. При Load необходимости метод перезаписывает значения столбцов, доступные только для чтения.

Если при вызове Load метода заданы параметры OverwriteChanges или PreserveChanges, то предполагается, что входящие данные поступают из основного DataTableисточника данных, а DataTable отслеживает изменения и может распространять изменения обратно в источник данных. При выборе параметра Upsert предполагается, что данные поступают из одного из дополнительных источников данных, например данных, предоставляемых компонентом среднего уровня, возможно, измененных пользователем. В этом случае предполагается, что целью является агрегировать данные из одного или нескольких источников данных в DataTable, а затем, возможно, распространить данные обратно в основной источник данных. Параметр LoadOption используется для определения конкретной версии строки, которая будет использоваться для сравнения первичного ключа. Подробные сведения приведены в таблице ниже.

Параметр загрузки Версия DataRow, используемая для сравнения первичного ключа
OverwriteChanges Исходная версия, если она существует, в противном случае — текущая версия
PreserveChanges Исходная версия, если она существует, в противном случае — текущая версия
Upsert Текущая версия, если она существует, в противном случае исходная версия

Параметр errorHandler является делегатом FillErrorEventHandler , который ссылается на процедуру, которая вызывается при возникновении ошибки при загрузке данных. Параметр FillErrorEventArgs , передаваемый в процедуру, предоставляет свойства, которые позволяют получить сведения о произошедшей ошибке, текущей строке данных и заполняемом объекте DataTable . Использование этого механизма делегата, а не простого блока try/catch, позволяет определить ошибку, обработать ситуацию и при желании продолжить обработку. Параметр FillErrorEventArgs предоставляет свойство : присвойте Continue этому свойству значение true , чтобы указать, что вы обработали ошибку и хотите продолжить обработку. Присвойте свойству значение false , чтобы указать, что вы хотите остановить обработку. Имейте в виду, что установка свойства в false значение приведет к тому, что код, вызвавшего проблему, вызовет исключение.

См. также раздел

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