Студопедия
АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция
|
Визуальное проектирование диалогового окна
Цель работы
Изучить принципы доступа к данным с помощью технологии ADO.NET. Получить навыки работы с пространствами имен, классами, методами, используемыми для работы с данными.
Сведения из теории
Все возможности ADO.NET заключены в типах, определенных в соответствующих пространствах имен, главным из которых является System.Data. Именно это пространство имен и будет рассматриваться в этой лабораторной работе.
Типы пространства имен System.Data
Эти типы предназначены для представления данных, полученных из источника (но не для установления соединения непосредственно с источником). В основном эти типы представляют собой объектные представления примитивов для работы с базами данных – таблицами, строками, столбцами, ограничениями и т.п. Наиболее часто используемые типы System.Data представлены в таблице. Кроме того, в этом пространстве имен определены важные исключения, которые могут быть сгенерированы при работе с БД (NoNullAllowedException, RowNotInTableException, MissingPrimaryKeyException и т.п.).
Тип
| Назначение
| DataColumnCollection
DataColumn
| DataColumn представляет собой один столбец в объекте DataTable, DataColumnCollection – все столбцы
| ConstraintCollection
Constraint
| Constraint – объектно-ориентированная оболочка вокруг ограничения (например, внешнего ключа или уникальности), наложенного на один или несколько объектов DataColumn, ConstraintCollection – все ограничения в объекте DataTable
| DataRowCollection
DataRow
| DataRow представляет собой единственную строку в DataTable, DataRowCollection – все строки в DataTable
| DataRowView
DataView
| DataRowView позволяет создавать настроенное представление единственной строки, DataView – созданное программным образом представление объекта DataTable, которое может быть использовано для сортировки, фильтрации, поиска, редактирования и перемещения
| DataSet
| Объект, создаваемый в оперативной памяти на клиентском компьютере. DataSet состоит из множества объектов DataTable и информации об отношениях между ними
| ForeignKeyConstraint
UniqueConstraint
| ForeignKeyConstraint представляет ограничение, налагаемое на набор столбцов в таблицах, связанных отношениями первичный - внешний ключ. UniqueConstraint – ограничение, при помощи которого гарантируется, что в столбце не будет повторяющихся записей
| DataRelationCollection
DataRelation
| Тип DataRelationCollection представляет набор всех отношений (то есть объектов DataRelation) между таблицами в DataSet
| DataTableCollection
DataTable
| Тип DataTableCollection представляет набор всех таблиц (объектов DataTable) в DataSet
|
Тип DataColumn
Тип DataColumn представляет отдельный столбец в таблице (которая, в свою очередь, должна быть представлена объектом DataTable). Наиболее важные свойства этого класса представлены в таблице.
Свойство
| Описание
| AllowDbNull
| Определяет, может ли столбец содержать значения типа Null (пустые значения). По умолчанию – может (свойство равно true)
| AutoIncrement
AutoIncrementSeed
AutoIncrementStep
| Используются для настройки автоматического приращения значений в таблице. Это может быть полезно, если необходимо обеспечить уникальность значений в столбце (например, для первичного ключа). По умолчанию автоматическое приращение значений в столбцах отключено
| Caption
| Определяет заголовок столбца для отображения в пользовательском приложении (например, этот заголовок может быть использован в DataGrid)
| ColumnMapping
| Определяет, как будет представлен столбец (объект DataColumn) при сохранении DataSet в формате XML
| ColumnName
| Позволяет получить или установить имя столбца в коллекции Columns (внутренняя коллекция для столбцов в DataTable). Если имя столбца не определено явно, будут использованы значения по умолчанию: Column1, Column2, Column3 и т.д.
| DataType
| Определяет тип данных (boolean, string, float и т.п.), используемый для значений в столбце
| DefaultValue
| Позволяет установить или получить значение по умолчанию для столбца. Это значение будет автоматически использовано, если при вставке новой строки не укажете явно другое значение
| Expression
| Позволяет получить или установить выражение, используемое для фильтрации новых строк, вычисления значения в столбце или создания столбцов с агрегатными значениями
| Ordinal
| Позволяет установить порядковый номер столбца в коллекции Columns в DataTable
| ReadOnly
| Определяет, будет ли столбец только для чтения. По умолчанию имеет значение false
| Table
| Возвращает DataTable, которой принадлежит данный объект DataColumn
| Unique
| Позволяет определить, будут ли в столбце допускаться повторяющиеся значения. Если столбец является первичным ключом, то это свойство должно иметь значение true
|
Тип DataRow
Как было сказано выше, структура таблицы определяется как коллекция объектов DataColumn. Для хранения этой коллекции в объекте DataTable используется внутренний объект DataColumnCollection. Помимо этого, для DataTable важна еще одна коллекция: коллекция объектов DataRow, которая и определяет собственно данные, хранящиеся в таблице. При помощи компонентов этого класса можно производить операции вставки, изменения и удаления строк таблицы, а также сравнивать значения, которые содержатся в строках.
Наиболее важные компоненты этого класса представлены в таблице. Кроме того, класс DataRow определяет индексатор, при помощи которого можно получить значение из поля строки по порядковому номеру. Конечно, то же самое значение можно будет получить и по имени столбца.
Компонент
| Назначение
| AcceptChanges()
RejectChanges()
| Для записи в строку (или отказа от них) всех изменений, произведенных начиная с момента, когда последний раз был вызван метод AcceptChanges()
| BeginEdit()
EndEdit()
CancelEdit()
| Начать, завершить, прекратить операции редактирования для объекта DataRow
| Delete()
| Помечает строку для удаления при следующем вызове метода AcceptChanges()
| HasErrors
GetColumnsInErrors()
GetColumnError()
ClearErrors()
RowError
| Свойство HasErrors возвращает логическое значение, определяющее, присутствуют ли ошибки в значениях столбцов для данной строки. Если такие ошибки есть, то для получения значений, которые нарушают установленные правила, можно использовать метод GetColumnsInErrors(). Для получения описания ошибки можно использовать GetColumnError(), а ClearErrors() просто удаляет все ошибочные значения из строки. Свойство RowError позволяет настроить текстовое описание для ошибки в столбце
| IsNull()
| Возвращает информацию о том, содержит ли строка в указанном поле пустое значение (типа NULL)
| ItemArray
| Позволяет получить или установить значения всех полей строки при помощи массива объектов
| RowState
| Позволяет получать информацию о текущем состоянии объекта DataRow. Используются значения из перечисления RowState
| Table
| Это свойство используется для получения указателя на таблицу, содержащую текущий объект DataRow
|
Главное назначение свойства RowState – определять (в процессе выполнения программы), в каком состоянии находятся выбранные строки в таблице: были ли они изменены, только что вставлены и т.п. Для этого свойства используются значения из перечисления DataRowState:
Значение
| Описание
| Deleted
| Строка была изменена при помощи метода DataRow.Delete
| Detached
| Строка была создана, но она еще не является частью DataRowCollection. Обычно строка находится в таком состоянии непосредственно после вставки или после принудительного вывода из коллекции DataRowCollection
| Modified
| Строка была изменена, но метод AcceptChanges() еще не вызывался
| New
| Строка была добавлена в коллекцию DataRowCollection, но метод AcceptChanges() еще не был вызван
| Unchanged
| Строка не была изменена с момента последнего вызова метода AcceptChanges()
|
Тип DataTable
Класс DataTable используется для создания в оперативной памяти моделей табличных наборов данных. Можно создавать объекты DataTable программным образом, однако чаще в приложениях объект DataTable создается автоматически с помощью возможностей DataSet и типов, определенных в пространствах имен System.Data.OleDb и System.Data.SqlClient. Наиболее важные свойства DataTable представлены в таблице:
Свойство
| Описание
| CaseSensitive
| Определяет, будет ли при сравнении символьных данных в таблице учитываться регистр символов. По умолчанию – false (не будет)
| ChildRelations
| Возвращает коллекцию подчиненных отношений (DataRelationCollection) для объекта DataTable (если такие отношения есть)
| Columns
| Возвращает набор столбцов для таблицы
| Constraints
| Позволяет получить коллекцию ограничений, определенных в столбце (ConstraintCollection)
| DataSet
| Позволяет получить ссылку на объект DataSet, к которому принадлежит данная таблица (если такой объект есть)
| DefaultView
| Позволяет получить настроенное представление для таблицы, которое может включать в себя, например, только некоторые выбранные пользователем столбцы или данные о положении курсора
| MinimumCapacity
| Позволяет получить или установить исходное количество строк в таблице (по умолчанию – 25)
| ParentRelations
| Позволяет получить коллекцию родительских отношений для данного объекта DataTable
| PrimaryKey
| Позволяет получить или установить массив столбцов, которые являются первичным ключом в таблице
| Rows
| Возвращает набор строк, относящихся к таблице
| TableName
| Позволяет получить имя таблицы или определить его. Значение для этого свойства может быть установлено через конструктор таблицы
|
Графическая схема наиболее важных компонентов DataTable представлена на рисунке 8.1. Следует обратить внимание, что схема не имеет никакого отношения к иерархии классов (к примеру, класс DataRow не является классом, производным от DataRowCollection). Эта схема представляет логические отношения «иметь» (“has-a”) между наиболее важными компонентами класса DataTable (например, объекты DataRow принадлежат к объекту DataRowCollection).
Рис. 8.1. Отношения компонентов DataTable
Наиболее важные методы DataTable представлены в таблице:
Метод
| Описание
| AcceptChanges()
| Подтверждает все изменения, сделанные в таблице после предыдущего вызова метода
| Clear()
| Очищает все данные объекта DataTable
| Compute(String expr, String filter)
| Выполняет вычисление выражения expr в строках таблицы, удовлетворяющих фильтру filter
| Copy()
| Копирует структуру и данные объекта DataTable
| NewRow()
| Создает новую запись (объект DataRow) данной таблицы
| RejectChanges()
| Отменяет все изменения, сделанные после загрузки таблицы либо после последнего вызова метода AcceptChanges
| Reset()
| Сбрасывает объект DataTable в исходное состояние
| Select()
| Возвращает массив всех записей таблицы (объектов DataRow)
| Select(String filter)
| Возвращает массив записей таблицы (объектов DataRow), соответствующих фильтру filter
|
Возможности класса DataSet
При работе с базами данных чаще всего таблицы используются не сам по себе, а во взаимодействии с другими таблицами. В ADO.NET возможности работы с наборами таблиц, связанными друг с другом, предоставляет класс DataSet.
Объект DataSet – это создаваемый в оперативной памяти набор таблиц (объектов DataTable), связанных между собой отношениями и снабженными средствами проверки целостности данных (для них в DataSet предусмотрены свои объекты). Иерархия классов, входящих в DataSet, представлена на рисунке 8.2.
Рис. 8.2. Внутренние коллекции DataSet
Основные свойства класса DataSet представлены в таблице:
Свойство
| Описание
| CaseSensitive
| Определяет, будет ли во время операций по сравнению текстовых строк в объектах DataTable учитываться регистр букв
| DataSetName
| Позволяет получить или задать имя для данного объекта DataSet. Обычно значение этого свойства задается как параметр, передаваемый конструктору
| EnforceConstraints
| Позволяет включить или отключить проверку соответствия ограничениям при выполнении операций обновления данных в DataSet
| HasErrors
| Позволяет получить значение, определяющее наличие ошибок в DataSet (т.е. ошибок в любой строке любой таблицы DataSet)
| Relations
| Позволяет обратиться к коллекции отношений между таблицами DataSet
| Tables
| Позволяет получить доступ к коллекции таблиц DataSet
|
Многие методы DataSet дублируют возможности, которые обеспечиваются свойствами. Самые важные методы DataSet представлены в таблице:
Метод
| Описание
| AcceptChanges()
| Позволяет сохранить в DataSet все изменения, произведенные с момента последнего вызова этого метода
| Clear()
| Полная очистка DataSet – удаляются все строки из всех таблиц
| Clone()
| Клонирует структуру DataSet, включая структуру таблиц, отношения между таблицами и ограничения
| Copy()
| Копирует DataSet (структуру вместе с данными)
| GetChanges()
| Возвращает копию DataSet, которая содержит все изменения, внесенные в оригинальный DataSet с момента последнего вызова для него метода AcceptChanges()
| GetChildRelations()
| Возвращает коллекцию подчиненных отношений для указанной таблицы
| GetParentRelations()
| Возвращает коллекцию родительских отношений для указанной таблицы
| HasChanges()
| Этот перегруженный метод позволяет получить информацию об изменениях, внесенных в DataSet (отдельно по вставленным, удаленным и измененным строкам)
| Merge()
| Этот перегруженный метод позволяет производить слияние разных объектов DataSet
| ReadXml()
ReadXmlSchema()
| Позволяют считывать данные в формате XML в DataSet из потока (файла, оперативной памяти, сетевого ресурса)
| RejectChanges()
| Отменяет все изменения , внесенные в DataSet с момента его создания или последнего вызова метода AcceptChanges()
| WriteXml()
WriteXmlSchema()
| Позволяют записывать данные в формате XML из DataSet в поток
|
Класс DataRelation
После того как в DataSet появилось несколько объектов таблиц, можно определить отношения между этими таблицами. Объектно-ориентированную оболочку вокруг отношений между таблицами представляет класс DataRelation. При создании объекта этого класса необходимо указать имя отношений, а также родительскую и подчиненную таблицы. Чтобы отношение было успешно установлено, в каждой из таблиц должен быть столбец с одинаковым названием и типом данных.
Объекты DataRelation хранятся в коллекции DataRelationCollection, поддерживаемой DataSet. В типе DataRelation предусмотрены свойства, которые позволяют получать ссылки на родительскую и подчиненную таблицу, участвующую в отношении, определять имя отношения и т.п. Наиболее часто используемые свойства представлены в таблице:
Свойство
| Описание
| ChildColumns
ChildKeyConstraint
ChildTable
| Позволяют получить информацию о подчиненной таблице, участвующей в отношении, а также ссылку на саму эту таблицу
| DataSet
| Позволяет получить ссылку на объект DataSet, к которому принадлежит данное отношение
| ParentColumns
ParentKeyConstraint
ParentTable
| Позволяют получить информацию о родительской таблице, участвующей в отношении, а также ссылку на саму эту таблицу
| RelationName
| Позволяет получить или задать имя для данного отношения
|
Перемещение между таблицами производится при помощи методов, определенных в классе DataRow. Так, метод GetChildRows() позволяет считывать строки из подчиненной таблицы, а метод GetParentRows() – из родительской таблицы.
Пример выполнения работы
Задание. Реализовать с помощью технологии ADO.NET программный интерфейс управления базой данных, созданной в предыдущей лабораторной работе. Предусмотреть возможность добавления, редактирования, удаления, фильтрации записей.
Визуальное проектирование диалогового окна
Внешний вид работающего приложения приведен на рисунке 8.3.
Настройки таблиц dataGridView1 и dataGridView1 приведены в описании предыдущей лабораторной работы.
Текстовые поля FamTextBox и NameTextBox используются для добавления новой записи или редактирования записи, выделенной в таблице. Для удобства редактирования при выделении строки в таблице данные об имени и фамилии человека копируются в соответствующие текстовые поля.
Рис. 8.3. Главная форма приложения
|