FillSchema(DataSet, SchemaType, String)

Метод реализует добавление или обновление схемы DataSet в соответствие со схемой в источнике данных.

Этот метод получает сведения схемы из источника данных с использованием свойства SelectCommand.

Операция FillSchema добавляет объект DataTable к указанному DataSet. Затем столбцы добавляются в объект DataColumnCollection объекта DataTable и настраиваются следующие свойства DataColumn, если они существуют в источнике данных:

  • AllowDBNull;

  • AutoIncrement. Свойства AutoIncrementStep и AutoIncrementSeed нужно задать отдельно;

  • MaxLength;

  • ReadOnly;

  • Unique.

Метод FillSchema также настраивает свойства PrimaryKey и Constraints в соответствии со следующими правилами:

  1. если один или несколько столбцов первичных ключей возвращаются свойством SelectCommand, то они используются в качестве столбцов первичных ключей для объекта DataTable;

  2. если столбцы первичных ключей не загружаются, а загружаются уникальные столбцы, то эти уникальные столбцы используются как первичный ключ только в том случае, если все они не могут содержать null-значения. Если хотя бы один столбец допускает null-значения, к объекту ConstraintCollection добавляется объект UniqueConstraint, но свойство PrimaryKey не задается;

  3. если возвращаются и столбцы первичных ключей, и уникальные столбцы, то столбцы первичных ключей используются в качестве столбцов первичных ключей для объекта DataTable.

Первичные ключи и уникальные ограничения добавляются к объекту ConstraintCollection в соответствии с предыдущими правилами, но другие типы ограничений не добавляются.

Сведения о первичном ключе используются во время применения метода Fill для поиска и замены строк, у которых столбцы ключей совпадают. Если это нежелательно, рекомендуется использовать метод Fill без запроса сведений о схеме.

Синтаксис
  public DataTable[] FillSchema(
    DataSet dataSet,
    SchemaType schemaType,
    string srcTable
);
    

dataSet – объект DataSet для заполнения схемой.

schemaType – одно из значений типа SchemaType, указывающее, как применять схему:

  • Source – информация о схеме должна браться из источника данных;

  • Mapped – к полям, возвращенным запросом, должна применяться схема из своей коллекции TableMappings.

srcTable – имя таблицы в источнике данных, используемой для загрузки записей.

Возвращаемое значение

Ссылка на коллекцию объектов DataTable, которые были добавлены в объект DataSet.

Исключения
ArgumentNullException Параметр dataSet содержит null-значение.
ArgumentException Параметр srcTable содержит null-значение или пустую строку.
InvalidOperationException Свойство SelectCommand не инициализировано.
ArgumentOutOfRangeException Значение параметра schemaType не является одним из значений SchemaType.
LinterSqlException Код завершения СУБД ЛИНТЕР не равен 0.
Примеры

1) Пример загрузки схемы для SchemaType.Mapped.

// C#
using System;
using System.Data;
using System.Data.Common;

class FillSchemaSample
{
  static void Main()
  {
    // Создание фабрики классов провайдера
    DbProviderFactory factory =
      DbProviderFactories.GetFactory("System.Data.LinterClient");
    // Соединение с БД
    DbConnection con = factory.CreateConnection();
    con.ConnectionString =
      "Data Source=LOCAL;User ID=SYSTEM;Password=MANAGER8";
    // Создание объекта DataSet
    DataSet dataset = new DataSet();
    // Создание объекта DataTable
    DataTable table = dataset.Tables.Add("Автомобили");
    table.Columns.Add("Номер", typeof(int));
    table.Columns.Add("Производитель", typeof(string));
    table.Columns.Add("Модель", typeof(string));
    // Отображение таблицы БД на таблицу DataTable
    DataTableMapping mapping = new DataTableMapping("Table", "Автомобили");
    mapping.ColumnMappings.Add("PERSONID", "Номер");
    mapping.ColumnMappings.Add("MAKE", "Производитель");
    mapping.ColumnMappings.Add("MODEL", "Модель");
    // Создание объекта DbDataAdapter
    DbDataAdapter adapter = factory.CreateDataAdapter();
    adapter.SelectCommand = factory.CreateCommand();
    adapter.SelectCommand.Connection = con;
    adapter.SelectCommand.CommandText =
      "select personid, make, model from auto";
    adapter.TableMappings.Add(mapping);
    // Вывод на экран исходной схемы
    Console.WriteLine("Исходная схема DataSet:");
    OutputSchema(dataset);
    // Заполнение объекта DataSet схемой из БД
    adapter.FillSchema(dataset, SchemaType.Mapped, "Table");
    // Вывод на экран полученной схемы
    Console.WriteLine("Схема DataSet после загрузки из БД:");
    OutputSchema(dataset);
  }
  private static void OutputSchema(DataSet dataset)
  {
    foreach (DataTable table in dataset.Tables)
    {
      Console.WriteLine("Имя таблицы: " + table.TableName);
      Console.WriteLine("Столбцы таблицы:");
      Console.WriteLine("ColumnName    | AllowDBNull | AutoIncrement | " +
        "MaxLength | ReadOnly | Unique");
      foreach (DataColumn column in table.Columns)
      {
        Console.WriteLine(
          "{0,-13} | {1,-11} | {2,-13} | {3,-9} | {4,-8} | {5,-6}",
          column.ColumnName, column.AllowDBNull, column.AutoIncrement,
          column.MaxLength, column.ReadOnly, column.Unique);
      }
    }
  }
}

Результат выполнения примера:

Исходная схема DataSet:
Имя таблицы: Автомобили
Столбцы таблицы:
ColumnName    | AllowDBNull | AutoIncrement | MaxLength | ReadOnly | Unique
Номер         | True        | False         | -1        | False    | False
Производитель | True        | False         | -1        | False    | False
Модель        | True        | False         | -1        | False    | False
Схема DataSet после загрузки из БД:
Имя таблицы: Автомобили
Столбцы таблицы:
ColumnName    | AllowDBNull | AutoIncrement | MaxLength | ReadOnly | Unique
Номер         | False       | False         | -1        | False    | True
Производитель | True        | False         | 20        | False    | False
Модель        | True        | False         | 20        | False    | False

2) Пример загрузки схемы для SchemaType.Source.

// C#
using System;
using System.Data;
using System.Data.Common;

class FillSchemaSample
{
  static void Main()
  {
    // Создание фабрики классов провайдера
    DbProviderFactory factory =
      DbProviderFactories.GetFactory("System.Data.LinterClient");
    // Соединение с БД
    DbConnection con = factory.CreateConnection();
    con.ConnectionString =
      "Data Source=LOCAL;User ID=SYSTEM;Password=MANAGER8";
    // Создание объекта DbDataAdapter
    DbDataAdapter adapter = factory.CreateDataAdapter();
    adapter.SelectCommand = factory.CreateCommand();
    adapter.SelectCommand.Connection = con;
    adapter.SelectCommand.CommandText =
      "select personid, make, model from auto";
    // Создание объекта DataSet
    DataSet dataset = new DataSet();
    // Заполнение объекта DataSet схемой из БД
    adapter.FillSchema(dataset, SchemaType.Source, "Table");
    // Вывод на экран полученной схемы
    Console.WriteLine("Схема DataSet после загрузки из БД:");
    OutputSchema(dataset);
  }
  private static void OutputSchema(DataSet dataset)
  {
    foreach (DataTable table in dataset.Tables)
    {
      Console.WriteLine("Имя таблицы: " + table.TableName);
      Console.WriteLine("Столбцы таблицы:");
      Console.WriteLine("ColumnName    | AllowDBNull | AutoIncrement | " +
        "MaxLength | ReadOnly | Unique");
      foreach (DataColumn column in table.Columns)
      {
        Console.WriteLine(
          "{0,-13} | {1,-11} | {2,-13} | {3,-9} | {4,-8} | {5,-6}",
          column.ColumnName, column.AllowDBNull, column.AutoIncrement,
          column.MaxLength, column.ReadOnly, column.Unique);
      }
    }
  }
}

Результат выполнения примера:

Схема DataSet после загрузки из БД:
Имя таблицы: Table
Столбцы таблицы:
ColumnName    | AllowDBNull | AutoIncrement | MaxLength | ReadOnly | Unique
PERSONID      | False       | False         | -1        | False    | True
MAKE          | True        | False         | 20        | False    | False
MODEL         | True        | False         | 20        | False    | False