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'