FillLoadOption

Свойство предоставляет или устанавливает значение перечисления типа LoadOption, определяющее, как адаптер заполняет объект DataTable из объекта DbDataReader.

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

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

Декларация
public LoadOption FillLoadOption {get; set;};
Значение свойства

Значение LoadOption:

  • OverwriteChanges (значение по умолчанию). Значение OverwriteChanges заставляет DataTable заменять любые изменения, внесенные в обе версии: «текущая» (current) и «исходная» (original) соответствующего DataRow текущего объекта DataTable, значениями, загружаемыми объектом DbDataAdapter из источника данных. Т.е. в DataTable будут содержаться только новые значения;

  • PreserveChanges. Все внесенные текущие изменения в DataRow будут сохраняться с версией «текущая» (current), а все вновь загружаемые объектом DbDataAdaper значения будут помещаться в соответствующий DataRow с версией «исходная» (original). Т.е. в DataTable будут содержаться как старые значения, так и новые;

  • Upsert. Свойство Upsert является комбинацией двух операций: UPdate и inSERT. Если загружаемая из источника данных запись в DataTable уже существует, то она будет заменена с указанием версии «текущая» (current), иначе запись будет добавлена с пометкой «представлена к обработке».

Исходная версия данных в столбце не изменяется.

Исключения

Отсутствуют.

Пример
// C#
using System;
using System.Data;
using System.Data.Common;

class FillLoadOptionSample
{
  static void Main()
  {
    // Создание фабрики классов провайдера
    DbProviderFactory factory =
      DbProviderFactories.GetFactory("System.Data.LinterClient");
    // Соединение с БД
    DbConnection con = factory.CreateConnection();
    con.ConnectionString =
      "Data Source=LOCAL;User ID=SYSTEM;Password=MANAGER8";
    con.Open();
    // Создание таблицы БД
    DbCommand cmd = factory.CreateCommand();
    cmd.Connection = con;
    cmd.CommandText =
      "create or replace table users ( " +
      "id integer primary key, name varchar(70));" +
      "insert into users (id, name) values (0, 'Пользователь A');" +
      "insert into users (id, name) values (1, 'Пользователь B');";
    cmd.ExecuteNonQuery();
    // Создание объекта DbDataAdapter
    DbDataAdapter adapter = factory.CreateDataAdapter();
    adapter.SelectCommand = factory.CreateCommand();
    adapter.SelectCommand.Connection = con;
    adapter.SelectCommand.CommandText =
      "select id, name from users";
    // Создание объекта DataTable
    DataTable users = CreateDataTable();
    Console.WriteLine("Исходная таблица:");
    Output(users);
    // Исходное и текущее значения будут заменены значениями,
    // загруженными из БД
    adapter.FillLoadOption = LoadOption.OverwriteChanges;
    adapter.Fill(users);
    Console.WriteLine("LoadOption.OverwriteChanges:");
    Output(users);
    // Исходные значения будут заменены на значения из БД.
    // Текущие значения строки не будут изменены.
    users = CreateDataTable();
    adapter.FillLoadOption = LoadOption.PreserveChanges;
    adapter.Fill(users);
    Console.WriteLine("LoadOption.PreserveChanges:");
    Output(users);
    // Исходные значения не будут изменены.
    // Текущие значения будут заменены на значения из БД.
    users = CreateDataTable();
    adapter.FillLoadOption = LoadOption.Upsert;
    adapter.Fill(users);
    Console.WriteLine("LoadOption.Upsert:");
    Output(users);
    // Освобождение ресурсов
    con.Close();
  }
  private static DataTable CreateDataTable()
  {
    DataTable users = new DataTable();
    users.Columns.Add("id", typeof(int));
    users.Columns.Add("name", typeof(string));
    users.PrimaryKey = new DataColumn[] { users.Columns[0] };
    users.Rows.Add(0, "Пользователь X");
    users.Rows.Add(1, "Пользователь Y");
    users.AcceptChanges();
    users.Rows[0]["name"] = "Новый Пользователь X";
    users.Rows[1]["name"] = "Новый Пользователь Y";
    return users;
  }
  private static void Output(DataTable users)
  {
    Console.WriteLine("ID | Исходное значение | Текущее значение");
    foreach (DataRow row in users.Rows)
    {
      Console.WriteLine("{0,-2} | {1,-17} | {2}", row[0],
        row.HasVersion(DataRowVersion.Original) ? row[1, DataRowVersion.Original] : "",
        row.HasVersion(DataRowVersion.Current) ? row[1, DataRowVersion.Current] : "");
    }
  }
}

Результат выполнения примера:

Исходная таблица:
ID | Исходное значение | Текущее значение
0  | Пользователь X    | Новый Пользователь X
1  | Пользователь Y    | Новый Пользователь Y
LoadOption.OverwriteChanges:
ID | Исходное значение | Текущее значение
0  | Пользователь A    | Пользователь A
1  | Пользователь B    | Пользователь B
LoadOption.PreserveChanges:
ID | Исходное значение | Текущее значение
0  | Пользователь A    | Новый Пользователь X
1  | Пользователь B    | Новый Пользователь Y
LoadOption.Upsert:
ID | Исходное значение | Текущее значение
0  | Пользователь X    | Пользователь A
1  | Пользователь Y    | Пользователь B