Файл: 1_C#_Введение_в_программирование_Уч_пособ_(Марченко-2005).pdf
ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 11.12.2025
Просмотров: 1308
Скачиваний: 3
Таким образом, DataSet является основой для построения различных вариантов отсоединённых объектов-хранилищ информации.
Класс DataSet – класс не абстрактный и не интерфейс. Это значит, что существует множество вариантов построения отсоединённых хранилищ.
На основе базового класса DataSet можно определять производные классы определённой конфигурации, которая соответсвует структуре базы данных.
Можно также создать объект-представитель класса DataSet. И добавить непосредственно к этому объекту все необходимые составляющие в виде таблиц- объектов-представителей класса Table соответствующей структуры и множества отношений Relation.
Объект DataSet изолирован от источников данных. Его назначение – представление в рамках приложения необходимого для решения поставленной задачи набора данных, включая таблицы и ограничения. Объект DataSet способен хранить информацию из нескольких источников. Он существует и функционирует исключительно за счёт объекта DataAdapter, который обслуживает DataSet.
Итак, это центральный компонент архитектуры доступа, основанный на отсоединённых данных в приложении представляет данные. На него работают все ранее перечисленные компоненты ADO.NET.
Объект-представитель DataSet ПРЕДСТАВЛЯЕТ ТАБЛИЦЫ. Таблицы любой конфигурации (в рамках допустимого). И для этого в DataSet’е есть всё необходимое. В числе его данных-членов имеется набор Tables. Таким образом, объект DataSet может содержать таблицы, количество которых ограничивается лишь возможностями набора Tables. Для каждой таблицы-элемента набора Tables может быть (и, естественно, должна быть) определена структура таблицы. В случае, когда приложение взаимодействует с реальной базой данных, структура таблиц в DataSet’е должна соответствовать структуре таблиц в базе данных.
Но этот объект и сам по себе, без сопутствующего окружения, представляет определённую ценность. Дело в том, что информация, представляемая в приложении в виде таблиц, НЕ ОБЯЗЯТЕЛЬНО должна иметь внешний источник в виде реальной базы данных. Ничто не мешает программисту обеспечить в приложении чтение обычного “плоского” файла или даже “накопить” необходимую информацию посредством интерактивного взаимодействия с пользователем, используя при этом обычный диалог. В конце концов, база данных – это один из возможных способов ОРГАНИЗАЦИИ информации (а не только её хранения!). Не случайно DataSet – это ОТСОЕДИНЁННЫЕ данные!
А если всё же требуется представление данных из реальной БД – DataAdapter поможет.
Структура класса DataSet
База Данных характеризуется множеством таблиц и множеством отношений между таблицами.
DataSet (как объявление класса) включает:
набор (возможно, что пустой) объявлений классов DataTable (фактически это описание структуры составляющих данный КЛАСС DataSet таблиц),
набор объявлений классов DataRelations, который обеспечивает |
установку |
связей между разными таблицами в рамках данного DataSet. |
содержать |
Структура DataSet может в точности повторять структуру БД и |
полный перечень таблиц и отношений, а может быть частичной копией БД и содержать, соответственно, лишь подмножество таблиц и подмножество отношений. Всё определяется решаемой с помощью данного DataSet задачей.
При всём при этом, следует иметь в виду, что DataSet, структура которого полностью соответствует структуре БД (ИДЕАЛЬНАЯ DataSet), никогда не помешает решению поставленной задачи. Даже если будет содержать излишнюю информацию.
Процесс объявления (построения) класса DataSet, который ПОДОБЕН структуре некоторой базе данных, является достаточно сложным и трудоёмким. Классструктурная копия БД содержит множество стандартных и трудных для ручного воспроизведения объявлений. Как правило, его объявление строится с использованием специальных средств-волшебников, которые позволяют оптимизировать и ускорить процесс воспроизведения структуры БД средствами языка программирования. В конечном счёте, появляется всё то же объявление класса, над которым также можно медитировать и (осторожно!) изменять его структуру.
228
Объект-представитель данного класса DataSet обеспечивает представление представление в памяти компа фрагмента данной БД. Этот объект является локальным представлением (фрагмента) БД.
DataSet
|
|
|
DataTable |
DataColumns |
|
|
|
|
|
|
|
|
|
DataRows |
|
|
|
||
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Constraints |
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
DataRelations
Члены класса DataSet представлены ниже.
Открытые конструкторы
DataSet - конструктор |
|
Перегружен. Инициализирует новый экземпляр класса |
||||||||
|
|
|
DataSet. |
|
|
|
|
|
|
|
Открытые свойства |
|
|
|
|
|
|
|
|
|
|
CaseSensitive |
|
Возвращает |
или |
задает |
значение, |
определяющее, |
||||
|
|
|
учитывается ли регистр при сравнении строк в объектах |
|||||||
|
|
|
DataTable. |
|
|
|
|
|
|
|
Container |
(унаследовано |
от |
Получает контейнер для компонента. |
|
|
|
||||
MarshalByValueComponent) |
|
|
|
|
|
|
|
|
|
|
DataSetName |
|
|
Возвращает или задает имя текущего DataSet. |
|
|
|||||
|
|
|
||||||||
DefaultViewManager |
|
Возвращает новое представление данных класса DataSet |
||||||||
|
|
|
для осуществления фильтрации, поиска или перехода с |
|||||||
|
|
|
помощью настраиваемого класса DataViewManager. |
|
|
|||||
DesignMode |
(унаследовано |
от |
Получает |
значение, |
указывающее, |
находится |
ли |
|||
MarshalByValueComponent) |
|
компонент в настоящий момент в режиме разработки. |
|
|||||||
EnforceConstraints |
|
Возвращает |
или |
задает |
значение, |
определяющее |
||||
|
|
|
соблюдение правил ограничения при попытке совершения |
|||||||
|
|
|
операции обновления. |
|
|
|
|
|
||
ExtendedProperties |
|
Возвращает |
коллекцию |
настраиваемых |
данных |
|||||
|
|
|
пользователя, связанных с DataSet. |
|
|
|
||||
HasErrors |
|
|
Возвращает значение, определяющее наличие ошибок в |
|||||||
|
|
|
любом из объектов DataTable в классе DataSet. |
|
|
|||||
Locale |
|
|
Возвращает или задает сведения о языке, используемые |
|||||||
|
|
|
для сравнения строк таблицы. |
|
|
|
|
|||
Namespace |
|
|
Возвращает или задает пространство имен класса |
|||||||
|
|
|
DataSet. |
|
|
|
|
|
|
|
Prefix |
|
|
Возвращает или задает префикс XML, который является |
|||||||
|
|
|
псевдонимом пространства имен класса DataSet. |
|
|
|||||
Relations |
|
|
Возвращает коллекцию соотношений, связывающих таблицы |
|||||||
|
|
|
и позволяющих переходить от родительских таблиц к |
|||||||
|
|
|
дочерним. |
|
|
|
|
|
|
|
Site |
|
|
Переопределен. |
Возвращает |
или |
задает |
|
тип |
||
|
|
|
System.ComponentModel.ISite для класса DataSet. |
|
||||||
Tables |
|
|
Возвращает коллекцию таблиц класса DataSet. |
|
|
|||||
|
|
|
|
|
|
|
|
|
|
|
Открытые методы |
|
|
|
|
|
|
|
|
|
|
AcceptChanges |
|
Сохраняет |
все изменения, внесенные в |
класс |
DataSet |
|||||
|
|
|
после его загрузки или после последнего вызова метода |
|||||||
|
|
|
AcceptChanges. |
|
|
|
|
|
|
|
Clear |
|
|
Удаляет из класса DataSet любые данные путем удаления |
|||||||
|
|
|
всех строк во всех таблицах. |
|
|
|
|
|||
229
Clone |
|
|
Копирует структуру класса DataSet, включая все схемы, |
||||||||||
|
|
|
соотношения |
и ограничения объекта DataTable. Данные |
|||||||||
|
|
|
не копируются. |
|
|
|
|
|
|
|
|
|
|
Copy |
|
|
Копирует структуру и данные для класса DataSet. |
|
|||||||||
Dispose |
(унаследовано |
от |
Перегружен. Освобождает ресурсы, использовавшиеся |
||||||||||
MarshalByValueComponent) |
|
объектом MarshalByValueComponent. |
|
|
|
|
|
||||||
Equals |
(унаследовано |
от |
Перегружен. Определяет, равны ли два экземпляра |
||||||||||
Object) |
|
|
Object. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
GetChanges |
|
|
Перегружен. |
Возвращает |
|
копию |
класса |
|
DataSet, |
||||
|
|
|
содержащую |
все изменения, внесенные после его |
|||||||||
|
|
|
последней |
загрузки |
или |
после |
вызова |
|
метода |
||||
|
|
|
AcceptChanges. |
|
|
|
|
|
|
|
|
|
|
GetHashCode (унаследовано |
от |
Служит хеш-функцией для |
конкретного |
типа, |
пригоден |
||||||||
Object) |
|
|
для использования в алгоритмах хеширования и |
||||||||||
|
|
|
структурах данных, например в хеш-таблице. |
|
|
|
|||||||
GetService |
(унаследовано |
от |
Получает реализацию объекта IServiceProvider. |
|
|
||||||||
MarshalByValueComponent) |
|
|
|
|
|
|
|
|
|
|
|
|
|
GetType |
(унаследовано |
от |
Возвращает Type текущего экземпляра. |
|
|
|
|
||||||
Object) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||
GetXml |
|
|
Возвращает XML-представление данных, хранящихся в |
||||||||||
|
|
|
классе DataSet. |
|
|
|
|
|
|
|
|
|
|
GetXmlSchema |
|
Возвращает XSD-схему для XML-представление данных, |
|||||||||||
|
|
|
хранящихся в классе DataSet. |
|
|
|
|
|
|
||||
HasChanges |
|
|
Перегружен. Возвращает значение, определяющее наличие |
||||||||||
|
|
|
изменений в классе DataSet, включая добавление, |
||||||||||
|
|
|
удаление или изменение строк. |
|
|
|
|
|
|
||||
InferXmlSchema |
|
Перегружен. Применяет XML-схему к классу DataSet. |
|||||||||||
|
|
|
|
|
|
|
|
|
|||||
Merge |
|
|
Перегружен. |
Осуществляет |
|
слияние |
указанного |
класса |
|||||
|
|
|
DataSet, DataTable или массива объектов DataRow с |
||||||||||
|
|
|
текущим объектом DataSet или DataTable. |
|
|
|
|
||||||
ReadXml |
|
|
Перегружен. Считывает XML-схему и данные в DataSet. |
||||||||||
|
|
|
|
|
|
||||||||
ReadXmlSchema |
|
Перегружен. Считывает XML-схему в DataSet. |
|
|
|
||||||||
|
|
|
|
|
|
|
|||||||
RejectChanges |
|
Отменяет все изменения, |
внесенные |
в |
класс |
DataSet |
|||||||
|
|
|
после его создания или после последнего вызова метода |
||||||||||
|
|
|
DataSet.AcceptChanges. |
|
|
|
|
|
|
|
|
||
Reset |
|
|
Сбрасывает |
DataSet |
в |
|
исходное |
состояние. |
Для |
||||
|
|
|
восстановления исходного состояния класса DataSet |
||||||||||
|
|
|
необходимо переопределить метод Reset в подклассах. |
||||||||||
ToString |
(унаследовано |
от |
Возвращает |
String, |
который |
представляет |
текущий |
||||||
Object) |
|
|
Object. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||
WriteXml |
|
|
Перегружен. Записывает XML-данные и по возможности |
||||||||||
|
|
|
схемы из DataSet. |
|
|
|
|
|
|
|
|
|
|
WriteXmlSchema |
|
Перегружен. Записывает структуру класса DataSet в |
|||||||||||
|
|
|
виде XML-схемы. |
|
|
|
|
|
|
|
|
|
|
Открытые события |
|
|
|
|
|
|
|
|
|
|
|
|
|
Disposed |
(унаследовано |
от |
Добавляет обработчик событий, чтобы воспринимать |
||||||||||
MarshalByValueComponent) |
|
событие Disposed на компоненте. |
|
|
|
|
|
|
|||||
MergeFailed |
|
Возникает, если значения первичного ключа конечного и |
|||||||||||
|
|
|
основного объектов DataRow совпадают, а свойство |
||||||||||
|
|
|
EnforceConstraints имеет значение true. |
|
|
|
|
||||||
Защищенные конструкторы |
|
|
|
|
|
|
|
|
|
|
|
|
|
DataSet - конструктор |
|
Перегружен. Инициализирует новый экземпляр класса |
|||||||||||
|
|
|
DataSet. |
|
|
|
|
|
|
|
|
|
|
Защищенные свойства |
|
|
|
|
|
|
|
|
|
|
|
|
|
Events |
(унаследовано |
от |
Получает |
список |
обработчиков |
событий, |
которые |
||||||
MarshalByValueComponent) |
|
подключены к этому компоненту. |
|
|
|
|
|
|
|||||
Защищенные методы |
|
|
|
|
|
|
|
|
|
|
|
|
|
Dispose |
(унаследовано |
от |
Перегружен. Освобождает ресурсы, использовавшиеся |
||||||||||
MarshalByValueComponent) |
|
объектом MarshalByValueComponent. |
|
|
|
|
|
||||||
Finalize |
(унаследовано |
от |
Переопределен. Позволяет |
|
объекту |
Object |
попытаться |
||||||
Object) |
|
|
освободить ресурсы и выполнить другие завершающие |
||||||||||
|
|
|
операции, перед тем как объект Object будет уничтожен |
||||||||||
|
|
|
в процессе сборки мусора. |
|
для |
функций |
финализации |
||||||
|
|
|
В языках |
C# и |
C++ |
|
|||||||
230
|
используется синтаксис деструктора. |
|
||
MemberwiseClone (унаследовано |
Создает неполную копию текущего Object. |
|
||
от Object) |
|
|
|
|
|
|
|
||
OnPropertyChanging |
Вызывает событие OnPropertyChanging. |
|
||
OnRemoveRelation |
Возникает при удалении объекта DataRelation из |
|||
|
DataTable. |
|
|
|
OnRemoveTable |
Возникает при удалении объекта DataTable из DataSet. |
|||
|
|
|||
RaisePropertyChanging |
Посылает уведомление об изменении указанного свойства |
|||
|
DataSet. |
|
|
|
ShouldSerializeRelations |
Возвращает |
значение, |
определяющее |
необходимость |
|
сохранения значения свойства Relations. |
|
||
ShouldSerializeTables |
Возвращает |
значение, |
определяющее |
необходимость |
|
сохранения значения свойства Tables. |
|
||
Явные реализации интерфейса |
|
|
|
|
System.ComponentModel.IListSource.ContainsListCollection |
|
|
||
DataSet в свободном полёте
//====================================================================================
DataSet myDataSet = new DataSet(); // Пустой объект представитель класса DataSet. DataTable myTable = new DataTable(); // Пустая таблица создана. myDataSet.Tables.Add(myTable); // И подсоединена к объекту класса DataSet.
// Определение структуры таблицы. Это мероприятие можно было
//провести и до присоединения таблицы. DataColumn shipColumn = new DataColumn(“Ships”); myDataSet.Tables[0].Columns.Add(shipColumn);
//Прочие столбцы подсоединяются аналогичным образом.
//Таким образом формируются поля данных таблицы.
//Внимание! После того, как определена структура таблицы,
//то есть определены ВСЕ СТОЛБЦЫ таблицы, от имени этой конкретной
//таблицы порождается объект-строка. Этот объект сразу располагается
//непосредственно в таблице. Для каждой определённой таблицы
//метод NewRow() порождает строку
//(последовательность значений соответствующего типа). Для непосредственного
//редактирования вновь созданной строки запоминается её ссылка. Работать
//со строкой через эту ссылку проще, чем с массивом строк таблицы.
DataRow myRow = myDataSet.Tables[0].NewRow();
//:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
//Остаётся заполнить строку таблицы содержательной информацией.
//При этом может быть использован любой источник данных.
//В данном примере предполагается наличие объекта типа ArrayList
//с именем ShipCollection.
for (int i = 0; i < ShipCollection.Count; i++)
{
myRow.Item[Counter] = ShipCollection[i];
}
//:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
//Заполненный объект-представитель класса DataRow добавляется к набору Rows
//класса DataTable.
myDataSet.Tables[0].Rows.Add(myRow);
//====================================================================================
Естественно, что данная последовательность действий может повторяться сколь угодно много раз, пока не будут созданы и не заполнены все члены объекта
DataSet.
Далее будет рассмотрен пример использования объекта DataSet для прочтения информации из текстового файла. При этом используется метод класса string Split(), который обеспечивает выделение из исходной строки подстрок с их последующим преобразованием в символьные массивы. Критерием выделения подстроки является массив символов-разделителей или целочисленное значение, определяющее максимальную длину подстроки.
231