MissingSchemaAction
Свойство предоставляет или устанавливает реакцию объекта DbDataAdapter
в ситуации, когда схема загружаемых данных не соответствует схеме в текущем объекте DataSet
.
Установка значений этого свойства требуется в том случае, если объект DataSet
не содержит таблицу (столбец) с именем, заданным при привязке таблицы (столбца) к выборке данных. Значения свойства указывают клиентскому приложению, как поступать в этом случае.
Декларация
public MissingSchemaAction MissingSchemaAction {get; set;};
Значение свойства
Значение MissingSchemaAction:
-
Add (значение по умолчанию). Добавляет необходимые таблицы или столбцы для завершения схемы (ограничения целостности не учитываются);
-
Ignore. Игнорирует лишние столбцы;
-
Error. Отсутствует сопоставление указанного столбца, создается исключение InvalidOperationException;
-
AddWithKey. Добавление информации о схеме в объект
DataSet
перед его заполнением данными предполагает, что ограничения целостности (первичный ключ, unique-значения, not null-значения и др.) включается сDataTable
в объектDataSet
. В результате, когда делается дополнительный вызов для заполненияDataSet
, информация об ограничениях целостности используется в случае совпадения добавляемых строк из источника данных с текущими строками вDataTable
, и текущие данные в таблицах заменяются данными из источника данных.
Без информации о схеме данных (например, некоторый столбец является первичным ключом и, следовательно, в DataSet
не должно быть строк с одинаковыми значениями первичного ключа) новые строки из источника данных добавляются в DataSet
, порождая дублирование строк.
Для исключения такой ситуации необходимо, чтобы DbDataAdapter
принимал во внимание схему загружаемых данных, что и указывается в свойстве MissingSchemaAction.
Использование метода FillSchema
или присвоение свойству MissingSchemaAction значения AddWithKey требует дополнительных затрат в источнике данных для получения схемы (метаданных) о столбцах с ограничением целостности, что может снизить производительность, поэтому, если клиентское приложение знает об ограничениях целостности загружаемых данных, рекомендуется указывать их в явном виде.
Примечание
Использование значения AddWithKey данного свойства обязательно в случае необходимости обрабатывать в клиентском приложении исключение «Constraint Exception», которое может быть сгенерировано при вызове метода Add(DataRow) или Add(Object[]) класса DataRowCollection
.
Исключения
ArgumentException
| Устанавливаемое значение не является одним из значений MissingSchemaAction. |
Пример
// C# using System; using System.Data; using System.Data.Common; class MissingSchemaActionSample { 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(); // Создание команды для выборки записей DbCommand selectCommand = factory.CreateCommand(); selectCommand.Connection = con; selectCommand.CommandText = "select id, name from users"; // Создание объекта DbDataAdapter DbDataAdapter adapter = factory.CreateDataAdapter(); adapter.SelectCommand = selectCommand; adapter.MissingSchemaAction = MissingSchemaAction.AddWithKey; // Создание объекта DbCommandBuilder DbCommandBuilder builder = factory.CreateCommandBuilder(); builder.DataAdapter = adapter; // Заполнение объекта DataTable данными из таблицы БД DataTable users = new DataTable(); adapter.Fill(users); try { // При добавление записи, нарушающей уникальность первичного // ключа, генерируется исключение users.Rows.Add(0, "Пользователь X"); } catch (ConstraintException ex) { Console.WriteLine(ex.Message); // Добавление корректной записи users.Rows.Add(2, "Пользователь Y"); } // Обновление БД adapter.Update(users); // Отображение таблицы после обновления Console.WriteLine("Строки таблицы после обновления:"); foreach (DataRow row in users.Rows) { Console.WriteLine("{0}: '{1}' ", row[0], row[1]); } // Освобождение ресурсов con.Close(); } } Результат выполнения примера: Column 'ID' is constrained to be unique. Value '0' is already present. Строки таблицы после обновления: 0: 'Пользователь A' 1: 'Пользователь B' 2: 'Пользователь Y'