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