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'