ADO.NET | DataColumn (original) (raw)
62
Работа с базами данных в .NET Framework --- ADO.NET --- DataColumn
Тип DataColumn представляет один столбец в объекте DataTable. Вообще-то множество всех объектов DataColumn, содержащихся в данном объекте DataTable, содержит всю информацию схемы таблицы. Например, если понадобится создать копию таблицы Inventory из базы данных AutoLot, нужно будет создать четыре объекта DataColumn, по одному для каждого столбца (CarID, Make, Color и PetName). После создания объектов DataColumn они обычно добавляются в коллекцию столбцов типа DataTable (с помощью свойства Columns).
Возможно, вы уже знаете, что любому столбцу в таблице базы данных можно назначить набор ограничений (в виде первичного ключа, значения по умолчанию, разрешения только на чтение информации и т.д.). Кроме того, каждый столбец таблицы должен относиться к одному из разрешенных в СУБД типов данных. К примеру, схема таблицы Inventory требует, чтобы столбец CarID содержал целые числа, а столбцы Make, Color и PetName — массив символов. Класс DataColumn имеет ряд свойств для указания таких моментов:
AllowDBNull
Указывает, может ли данный столбец содержать пустые значения. По умолчанию содержит значение true
AutoIncrement, AutoIncrementSeed, AutoIncrementStep
Применяются для настройки поведения автоинкремента для данного столбца. Это может оказаться удобным, если нужно обеспечить уникальность значений в этом DataColumn (например, если он содержит первичные ключи). По умолчанию DataColumn не поддерживает автоинкрементное поведение
Caption
Задает или получает заголовок, который должен отображаться для данного столбца. Это позволяет определить более наглядные варианты для имен столбцов в базе данных
ColumnMapping
Определяет представление DataColumn при сохранении DataSet в виде XML-документа с помощью метода DataSet.WriteXml(). Можно указать, что столбец данных должен быть записан как XML-элемент, XML-атрибут, простое текстовое содержимое, либо его следует полностью проигнорировать
ColumnName
Задает или получает имя столбца из коллекции Columns (т.е. его внутреннее представление в DataTable). Если не занести значение в ColumnName явно, то по умолчанию там находится слово "Column" с числовыми суффиксами по формуле n+1 (т.е. Column1, Column2, Column3 и т.д.)
DataType
Определяет тип данных (логический, строковый, с плавающей точкой и т.д.), хранящихся в данном столбце
DefaultValue
Задает или получает значение по умолчанию, заносимое в данный столбец при вставке новых строк
Expression
Задает или получает выражение для фильтрации строк, вычисления значения столбца или создания агрегированного столбца
Ordinal
Задает или получает числовое положение столбца в коллекции Columns, содержащейся в DataTable
Readonly
Определяет, предназначен ли данный столбец только для чтения после добавления строки в таблицу. По умолчанию равно false
Table
Получает объект DataTable, содержащий данный DataColumn
Unique
Задает или получает значение, указывающее, должны ли быть уникальными значения во всех строках данного столбца, или допустимы совпадения. При присвоении столбцу ограничения первичного ключа свойство Unique должно содержать значение true
Продолжаем создание проекта SimpleDataSet (и демонстрацию применения типа DataColumn). Предположим, что вам нужно смоделировать столбцы таблицы Inventory. Поскольку столбец CarID должен быть первичным ключом таблицы, его необходимо создать только для чтения, содержащим уникальные значения и не допускающим пустые значения (с помощью свойств Readonly, Unique и AllowDBNull). Вставьте в класс Program новый метод FillDataSet(), предназначенный для создания четырех объектов DataColumn. Он принимает в качестве единственного параметра объект DataSet:
static void FillDataSet(DataSet ds)
{
DataColumn carIDColumn = new DataColumn("CarID", typeof(int));
carIDColumn.Caption = "Car ID";
carIDColumn.ReadOnly = true;
carIDColumn.AllowDBNull = false;
carIDColumn.Unique = true;
DataColumn carMakeColumn = new DataColumn("Make", typeof(string));
DataColumn carColorColumn = new DataColumn("Color", typeof(string));
DataColumn carPetName = new DataColumn("PetName", typeof(string));
carPetName.Caption = "Дружественное имя";
}
Обратите внимание, что при конфигурировании объекта carIDColumn было присвоено значение свойству Caption. Это позволяет определить строковое значение для отображения при выводе данных, которое может отличаться от имени столбца (имена столбцов в таблицах баз данных обычно более удобны для программирования (например, au_fname), чем для отображения (например, Author First Name)). По той же причине здесь задано заглавие столбца PetName, т.к. название столбца "Дружественное имя" понятнее конечному пользователю, чем PetName.
Одним из аспектов DataColumn, допускающим настройку, является возможность автоинкремента (autoincrement). Если в какую-либо таблицу добавляется новая строка, то значение автоинкрементного поля устанавливается автоматически, на основании предыдущего значения и шага автоинкремента. Это удобно, когда нужно, чтобы в каком-либо столбце не было повторяющихся значений (обычно это первичный ключ).
Такое поведение регулируется свойствами Autoincrement, AutoIncrementSeed и AutoIncrementStep. Значение AutoIncrementSeed используется для задания начального значения в столбце, AutoIncrementStep — для задания числа, которое прибавляется для каждого последующего значения. Рассмотрим следующую модификацию создания carIDColumn:
static void FillDataSet(DataSet ds)
{
DataColumn carIDColumn = new DataColumn("CarID", typeof(int));
carIDColumn.Caption = "Car ID";
carIDColumn.ReadOnly = true;
carIDColumn.AllowDBNull = false;
carIDColumn.Unique = true;
carIDColumn.AutoIncrement = true;
carIDColumn.AutoIncrementSeed = 0;
carIDColumn.AutoIncrementStep = 1;
...
Здесь объект carIDColumn настроен так, что при добавлении новых строк его значения увеличиваются на 1. Поскольку первоначальное значение задано равным 0, в столбце будут содержаться числа 0, 1, 2, 3 и т.д.
Обычно тип DataColumn не применяется обособленно, а вставляется в нужный объект DataTable. Для демонстрации создайте новый объект DataTable и вставьте каждый объект DataColumn в коллекцию столбцов с помощью свойства Columns:
// Добавление объектов DataColumn в DataTable
DataTable inventoryTable = new DataTable("Inventory");
inventoryTable.Columns.AddRange(new DataColumn[]
{ carIDColumn, carMakeColumn, carColorColumn, carPetName });
Теперь объект DataTable содержит четыре объекта DataColumn, которые представляют схему находящейся в памяти таблицы Inventory. Но пока эта таблица еще не содержит данных и не входит в коллекцию таблиц, принадлежащих конкретному DataSet. Мы сделаем и то, и то, а начнем с заполнения таблицы данными с помощью объектов DataRow.