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