Поделиться через


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 В этих сценариях описано стандартное использование для a 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.cs
Исходный код:
DataTable.cs

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

public:
 void Load(System::Data::IDataReader ^ reader);
[System.Diagnostics.CodeAnalysis.RequiresUnreferencedCode("Members from types used in the expression column to be trimmed if not referenced directly.")]
public void Load(System.Data.IDataReader reader);
public void Load(System.Data.IDataReader reader);
[<System.Diagnostics.CodeAnalysis.RequiresUnreferencedCode("Members from types used in the expression column to be trimmed if not referenced directly.")>]
member this.Load : System.Data.IDataReader -> unit
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 значение в качестве подразумеваемого значения по умолчанию.

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

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

State = <Deleted>

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.cs
Исходный код:
DataTable.cs

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

public:
 void Load(System::Data::IDataReader ^ reader, System::Data::LoadOption loadOption);
[System.Diagnostics.CodeAnalysis.RequiresUnreferencedCode("Using LoadOption may cause members from types used in the expression column to be trimmed if not referenced directly.")]
public void Load(System.Data.IDataReader reader, System.Data.LoadOption loadOption);
public void Load(System.Data.IDataReader reader, System.Data.LoadOption loadOption);
[<System.Diagnostics.CodeAnalysis.RequiresUnreferencedCode("Using LoadOption may cause members from types used in the expression column to be trimmed if not referenced directly.")>]
member this.Load : System.Data.IDataReader * System.Data.LoadOption -> unit
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 в качестве подразумеваемого значения по умолчанию.

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

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

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

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

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

Существующий DataRowState Upsert ПерезаписьChanges PreserveChanges (поведение по умолчанию)
Добавлено Current = <Входящие>

Original = -<Not available>

State = <Added>

RowAction = Change
Current = <Входящие>

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

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

RowAction = ChangeCurrentAndOriginal
Current = <Existing>

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

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

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

Original = <существующий>

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

RowAction = Change
Current = <Входящие>

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

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

RowAction = ChangeCurrentAndOriginal
Current = <Existing>

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

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

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

Current = ---

Original = <существующий>

State = <Deleted>

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

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

Original = <Not available>

State = <Added>

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

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

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

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

RowAction = ChangeCurrentAndOriginal
Current = <Not available>

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

State = <Deleted>

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

Original = <существующий>

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

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

RowAction = Ничего

Еще

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

RowAction = Change
Current = <Входящие>

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

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

RowAction = ChangeCurrentAndOriginal
Current = <Входящие>

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

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

RowAction = ChangeCurrentAndOriginal
Нет) Current = <Входящие>

Original = <Not available>

State = <Added>

RowAction = Add
Current = <Входящие>

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

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

RowAction = ChangeCurrentAndOriginal
Current = <Входящие>

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

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

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.cs
Исходный код:
DataTable.cs

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

public:
 virtual void Load(System::Data::IDataReader ^ reader, System::Data::LoadOption loadOption, System::Data::FillErrorEventHandler ^ errorHandler);
[System.Diagnostics.CodeAnalysis.RequiresUnreferencedCode("Using LoadOption may cause members from types used in the expression column to be trimmed if not referenced directly.")]
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);
[<System.Diagnostics.CodeAnalysis.RequiresUnreferencedCode("Using LoadOption may cause members from types used in the expression column to be trimmed if not referenced directly.")>]
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
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 в качестве подразумеваемого значения по умолчанию.

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

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

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

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

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

Существующий DataRowState Upsert ПерезаписьChanges PreserveChanges (поведение по умолчанию)
Добавлено Current = <Входящие>

Original = -<Not available>

State = <Added>

RowAction = Change
Current = <Входящие>

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

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

RowAction = ChangeCurrentAndOriginal
Current = <Existing>

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

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

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

Original = <существующий>

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

RowAction = Change
Current = <Входящие>

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

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

RowAction = ChangeCurrentAndOriginal
Current = <Existing>

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

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

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

Current = ---

Original = <существующий>

State = <Deleted>

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

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

Original = <Not available>

State = <Added>

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

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

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

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

RowAction = ChangeCurrentAndOriginal
Current = <Not available>

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

State = <Deleted>

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

Original = <существующий>

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

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

RowAction = Ничего

Еще

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

RowAction = Change
Current = <Входящие>

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

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

RowAction = ChangeCurrentAndOriginal
Current = <Входящие>

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

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

RowAction = ChangeCurrentAndOriginal
Нет) Current = <Входящие>

Original = <Not available>

State = <Added>

RowAction = Add
Current = <Входящие>

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

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

RowAction = ChangeCurrentAndOriginal
Current = <Входящие>

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

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

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

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

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