- •А.А. Волосевич
- •4. БАзы данных и технология ado.Net 3
- •4. БАзы данных и технология ado.Net
- •4.1. Архитектура ado.Net
- •4.2. Соединение с базой данных
- •4.3. Выполнение команд и запросов к базе данных
- •4.4. Параметризированные запросы
- •4.5. Чтение данных и объект DataReader
- •4.6. Рассоединенный набор данных
- •4.7. Объект класса DataColumn – колонка таблицы
- •4.8. Объекты класса DataRow – строки таблицы
- •4.9. Работа с объектом класса DataTable
- •4.10. Схема данных и типизированные dataset
- •4.11. Навигация, Поиск и фильтрация данных в DataSet
- •4.12. Класс DataView
- •4.13. Заполнение Рассоединенного набора данных
- •4.14. СиНхронизация набора данных и базы
- •4.15. Работа с транзакциями
4.6. Рассоединенный набор данных
ADO.NET предоставляет возможность работы с рассоединенным набором данных. Такой набор реализуется объектом класса DataSet. Это реляционная структура, которая хранится в памяти. DataSet содержит набор таблиц (объектов класса DataTable) и связей между таблицами (объекты класса DataRelation). В свою очередь, отдельная таблица содержит набор столбцов (объекты класса DataColumn), строк (объекты класса DataRow) и ограничений (объекты классов, унаследованных от Constraint). Столбцы и ограничения описывают структуру отдельной таблицы, а строки хранят данные таблицы.
Технически, отдельные компоненты DataSet хранятся в специализированных коллекциях. Например, DataSet содержит коллекции Tables и Relations. Таблица имеет коллекции Columns (для колонок), Rows (для строк), Constraints (для ограничений), ParentRelations и ChildRelations (для связей таблицы). Любая подобная коллекция обладает сходных набором свойств и методов. Коллекции имеют перегруженные индексаторы для обращения к элементу по номеру и по имени, методы добавления, поиска и удаления элементов. Методы добавления перегружены и обеспечивают как добавление существующего объекта, так и автоматическое создание соответствующего объекта перед помещением в коллекцию.
Для набора данных DataSet введём понятие схемы данных. Под схемой будем понимать совокупность следующих элементов:
-
Имена таблиц;
-
Тип и имя отдельных столбцов таблицы;
-
Ограничения на столбцы таблицы: уникальность, отсутствие пустых значений, первичные и внешние ключи;
-
Связи между таблицами;
-
События набора данных и таблицы, которые происходят при работе со строками (аналоги триггеров в базах данных).
Схема данных может быть определена различными способами:
-
Вручную, путем создания и настройки свойств столбцов, таблиц, связей;
-
Автоматически, при загрузке данных в набор из базы;
-
Загрузкой схемы, которая была создана и сохранена ранее в XSD-файле.
Правильно созданная схема обеспечивает контроль целостности данных в приложении перед их загрузкой в базу. К сожалению, при загрузке данных из базы в пустой набор генерируется только часть схемы данных (например, в схеме будут отсутствовать связи между таблицами). Рекомендуется подход, при котором в пустом наборе программно создается полная схема, и только затем в этот набор производится считывание данных.
4.7. Объект класса DataColumn – колонка таблицы
Структура любой таблицы описывается свойствами ее столбцов. Столбец таблицы представлен объектом класса DataColumn. Этот класс содержит следующий набор свойств, перечисленных в табл. 6.
Таблица 6
Свойства класса DataColumn
Имя свойства |
Тип |
Описание |
AllowDBNull |
bool |
Задаёт, возможны ли в столбце пустые значения |
AutoIncrement |
bool |
Генерируется ли для столбца новое значение автоприращения |
AutoIncrementSeed |
int |
Начальное значение автоприращения |
AutoIncrementStep |
Int |
Шаг автоприращения |
Caption |
string |
Заголовок столбца, отображаемый в элементах управления |
ColumnMapping |
MappingType |
Определяет, как будет записано содержимое столбца в XML-документ |
ColumnName |
string |
Имя столбца в таблице |
DataType |
Type |
Тип данных столбца |
DefaultValue |
object |
Значение по умолчанию в столбце |
Expression |
string |
Выражение для вычисляемых столбцов |
MaxLength |
int |
Максимальная длина строковых данных в столбце |
Namespace |
string |
Имя пространства имен XML, используемого при загрузке и чтении столбца из XML-файла |
Ordinal |
int |
Порядковый номер столбца в таблице |
Prefix |
string |
Префикс пространства имен XML; используется при загрузке и чтении столбца из XML-файла |
ReadOnly |
bool |
Указывает, что содержимое столбца доступно только для чтения |
Table |
DataTable |
Таблица, в состав которой входит столбец |
Unique |
bool |
Должно ли быть значение в столбце уникальным в пределах таблицы |
«Ручное» создание объектов-столбцов используется при самостоятельном формировании схемы DataSet. Минимально допустимая настройка столбца заключается в указании его имени и типа данных1. После этого столбец может быть добавлен в таблицу (при этом заполнятся свойства Ordinal и Table).
var dc = new DataColumn
{ ColumnName = "New Column", DataType = typeof(int) };
var dt = new DataTable();
dt.Columns.Add(dc);
Можно указать значение по умолчанию в столбце – свойство столбца DefaultValue. Если свойство AllowDBNull установлено в true, то допустимы пустые значения столбца (столбец может содержать объект класса DBNull2).
Свойства AutoIncrement, AutoIncrementSeed и AutoIncrementStep используются для организации автоматического приращения значений столбца (по умолчанию автоприращение не активно). Тип свойства с автоприращением должен быть целочисленным. Автоприращение может быть полезно при организации первичного ключа таблицы2.
При работе с набором данных существует возможность сохранить его в виде XML-документа. Свойство ColumnMapping настраивает представление столбца при сохранении. Следующий код обеспечивает сохранение значений столбца id в виде атрибута:
id.ColumnMapping = MappingType.Attribute;
К свойствам для поддержки работы с XML относятся также свойства Namespace и Prefix.
Для хранения столбцов класс DataTable использует свойство Columns типа DataColumnCollection. Добавлять столбцы можно по одному (метод коллекции Add()) или целым массивом (метод AddRange()). Кроме этого, метод Add() имеет удобную перегруженную версию, которая позволяет неявно создать столбец, указав его имя и тип.