Прочитать на английском

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


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

Комментарии

Метод 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);

Параметры

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

Комментарии

Метод 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 метода и действие события
Добавлено Текущая = <существующая>

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

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

RowAction = ChangeOriginal
Изменен Текущая = <существующая>

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

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

RowAction = ChangeOriginal
Удаленная Текущий = <недоступен>

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

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

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

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

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

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

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

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

RowAction = ChangeCurrentAndOriginal

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

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

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

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

.NET 9 и другие версии
Продукт Версии
.NET Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 2.0, 2.1

Load(IDataReader, LoadOption)

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

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

public void Load (System.Data.IDataReader reader, System.Data.LoadOption 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);
}

Комментарии

Метод 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 (поведение по умолчанию)
Добавлено Current = <Входящие>

Original = -<Not available>

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

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

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

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

RowAction = ChangeCurrentAndOriginal
Current = <Existing>

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

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

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

Original = <Existing>

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

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

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

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

RowAction = ChangeCurrentAndOriginal
Current = <Existing>

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

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

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

Current = ---

Original = <Existing>

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

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

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

Original = <Недоступен>

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

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

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

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

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

RowAction = ChangeCurrentAndOriginal
Current = <Недоступен>

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

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

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

Original = <Existing>

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

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

RowAction = Nothing

ELSE

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

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

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

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

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

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

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

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

Original = <Недоступен>

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

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 Текущая версия, если она существует, в противном случае — исходная версия

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

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

.NET 9 и другие версии
Продукт Версии
.NET Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 2.0, 2.1

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

Параметры

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

Комментарии

Метод 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 (поведение по умолчанию)
Добавлено Current = <Входящие>

Original = -<Not available>

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

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

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

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

RowAction = ChangeCurrentAndOriginal
Current = <Existing>

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

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

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

Original = <Existing>

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

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

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

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

RowAction = ChangeCurrentAndOriginal
Current = <Existing>

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

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

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

Current = ---

Original = <Existing>

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

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

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

Original = <Недоступен>

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

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

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

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

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

RowAction = ChangeCurrentAndOriginal
Current = <Недоступен>

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

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

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

Original = <Existing>

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

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

RowAction = Nothing

ELSE

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

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

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

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

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

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

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

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

Original = <Недоступен>

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

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

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

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

.NET 9 и другие версии
Продукт Версии
.NET Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 2.0, 2.1