FillSchema(DataSet, SchemaType, String)
Метод реализует добавление или обновление схемы DataSet в соответствие со схемой в источнике данных.
Этот метод получает сведения схемы из источника данных с использованием свойства SelectCommand.
Операция FillSchema добавляет объект DataTable к указанному DataSet. Затем столбцы добавляются в объект DataColumnCollection объекта DataTable и настраиваются следующие свойства DataColumn, если они существуют в источнике данных:
-
AllowDBNull;
-
AutoIncrement. Свойства AutoIncrementStep и AutoIncrementSeed нужно задать отдельно;
-
MaxLength;
-
ReadOnly;
-
Unique.
Метод FillSchema также настраивает свойства PrimaryKey и Constraints в соответствии со следующими правилами:
-
если один или несколько столбцов первичных ключей возвращаются свойством SelectCommand, то они используются в качестве столбцов первичных ключей для объекта
DataTable; -
если столбцы первичных ключей не загружаются, а загружаются уникальные столбцы, то эти уникальные столбцы используются как первичный ключ только в том случае, если все они не могут содержать null-значения. Если хотя бы один столбец допускает null-значения, к объекту
ConstraintCollectionдобавляется объектUniqueConstraint, но свойство PrimaryKey не задается; -
если возвращаются и столбцы первичных ключей, и уникальные столбцы, то столбцы первичных ключей используются в качестве столбцов первичных ключей для объекта
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