- •Часть 1.
- •1. Инструментарий среды Visual Studio 2008 по разработке приложений баз данных
- •1.1. Окно Источники данных
- •1.2. Окно Обозреватель баз данных
- •Создание локальной бд с помощью sql Server Compact 3.5 и Visual Studio
- •Общие сведения о локальных данных
- •Добавление в проект базы данных sql Server Compact 3.5
- •Создание новой базы данных sql Server Compact 3.5
- •Добавление существующей базы данных в проект
- •Создание новых таблиц в базе данных
- •Создание столбца с автоматической генерацией значения
- •Создание ограничения ссылочной целостности между таблицами базы данных
- •Заполнение таблиц данными
- •Подключение к данным в приложениях Windows Forms
- •Отображение данных в элементе управления DataGridView в Windows Forms
- •Отображение данных одной таблицы
- •Отображение данных из нескольких связанных таблиц
- •Создание общей таблицы
- •Создание таблицы подстановок
- •Связывание элементов управления Windows Forms с компонентом BindingSource с помощью конструктора
- •Для привязки элемента управления при разработке выполните следующие действия.
- •Переход между строками с помощью элемента управления BindingNavigator
- •Поиск заданной строки в таблице
- •Поиск строки со значением первичного ключа
- •Поиск строк по значениям столбцов
- •Диалоговое окно Построитель условий поиска
- •Агрегирование
- •Вычисляемые поля
- •Модификация строк в наборах данных
- •Добавление строк в наборы данных
- •Получение определенных версий объекта DataRow
- •Редактирование строк в объекте DataTable
- •Удаление строк из объекта DataTable
- •Сохранение данных в источнике данных
- •Чтобы внести изменения в набор данных вызовите метод AcceptChanges в DataSet, DataTable или DataRow:
- •Получение измененных записей
- •Дополнительные сведения по работе с базами данных в Visual Studio
- •Наборы данных в Visual Studio
- •Описание основных компонентов по работе с базами данных
- •Лабораторная работа №3 Создание базы данных «Автотранспорт»
- •Лабораторная работа №4 Агрегированные и вычисляемые поля
- •Лабораторная работа №5 Подстановочные, агрегированные и вычисляемые поля
- •Лабораторная работа №6 Проверочная
- •Лабораторная работа №7 Редактирование
- •Лабораторная работа №8 Поиск и сортировка данных
Описание основных компонентов по работе с базами данных
Таблица данных на форме DataGridView
Элемент управления DataGridView предоставляет мощный и гибкий способ отображения данных в табличном формате.
Связывание данных с элементом управления DataGridView
Для работы элемента управления DataGridView его необходимо связать с источником данных в режиме разработки с помощью свойств DataSource и DataMember или во время выполнения с помощью метода SetDataBinding.
В элементе управления DataGridView отображаются результаты выполнения операций над данными. Большинство операций с данными выполняется не с помощью DataGridView, а с помощью источника данных.
Одновременно в DataGridView может отображаться только одна таблица.
Для DataGridView допустимыми являются следующие источники данных.
Класс DataTable
Класс DataView
Класс DataSet
Класс DataViewManager
Если источником является набор данных, то им может быть либо объект в форме, либо объект, переданный в форму с помощью веб-службы XML. Существует возможность привязки как к типизированным, так и к нетипизированные наборам данных.
Сортировка данных в DataGridView
Если в элементе управления DataGridView отображается таблица, а свойство AllowSorting имеет значение true, можно изменить сортировку данных, щелкнув заголовок столбца.
Редактирование данных в DataGridView
Пользователь может добавлять строки и редактировать ячейки или отключить эти возможности с помощью панели задач:
Откройте панель задач компонента DataGridView.
Если возможности редактирования, вставки или удаления строк таблицы должны отсутствовать, то выклбючите соотвествующие переключатели:
Компонент TableAdapters
Адаптеры таблиц (TableAdapters) обеспечивают связь между приложением и базой данных. Адаптер таблиц подключается к базе данных, выполняет запросы или хранимые процедуры и либо возвращает новую заполненную таблицу данных, либо заполняет существующую таблицу (DataTable) возвращаемыми данными. Адаптеры таблиц также используются для отправки обновленных данных из приложения обратно в базу данных.
Как правило, адаптеры таблиц содержат методы Fill и Update для извлечения и обновления данных в базе данных.
Можно создавать адаптеры таблиц:
во время создания нового набора данных в мастере настройки источника данных;
в существующих наборах данных при помощи мастера настройки адаптера таблицы;
путем перетаскивания объектов базы данных из окна Обозреватель баз данных в Конструктор наборов данных.
При создании TableAdapter начальный запрос или сохраненная процедура используются для определения схемы адаптера, связанного с DataTable. Этот начальный запрос или сохраненная процедура выполняются путем вызова основного метода адаптера таблицы Fill (который заполняет связанную с адаптером DataTable). Любые изменения, внесенные в основной запрос адаптера TableAdapter, отражаются в схеме связанной таблицы данных.
Запросы адаптера таблиц
Пользователь может определить столько запросов для TableAdapter, сколько требуется для приложения. При этом каждый запрос возвращает данные, которые соответствуют той же схеме, что и связанная таблица данных. Это позволяет загружать данные, которые удовлетворяют различным критериям. Например, если приложение содержит таблицу сотрудников, то можно создать запрос, заполняющий таблицу сотрудников, чье имя начинается с определенных букв, и другой запрос, отбирающий всех сотрудников, проживающих на одной улице.
В дополнение к запросам, возвращающим данные из одной и той же схемы, можно добавить запросы, возвращающие скалярные (одиночные) значения. Например, созданный запрос, возвращающий число сотрудников:
SELECT Count(*) From person
является допустимым для personTableAdapter, даже если возвращаемые данные не соответствует схеме таблицы.
Методы и свойства TableAdapter
Во время разработки приложения часто приходится менять установленные по умолчанию свойства компонентов. Так, имя, присвоенное TableAdapter при его создании, основано на имени таблицы, с которой происходит работа. Например, при создании TableAdapter на основе таблицы в базе данных с именем person TableAdapter будет иметь имя personTableAdapter. Имя класса TableAdapter можно изменить с помощью свойства Name в Конструкторе наборов данных.
Ниже перечислены часто используемые методы и свойства TableAdapters:
Член |
Описание |
|
Заполняет таблицу TableAdapter, связанную с адаптером, результатами выполнения команды SELECT, заданной в адаптере. |
|
Отправляет изменения обратно в базу данных и возвращает целое число, представляющее количество обновленных строк. |
|
Возвращает новую DataTable, заполненную данными. |
|
Создает новую строку в таблице данных. |
Для редактирования адаптера таблиц:
Откройте набор данных в Конструкторе наборов данных.
Выберите TableAdapter, который требуется изменить.
Щелкните правой кнопкой мыши имя TableAdapter и нажмите кнопку Настройка.
Открывается Мастер настройки Адаптеров таблиц, готовый для изменения запроса или сохраненной процедуры, заполняющей связанную таблицу данных адаптера.
В Мастере настройки Адаптеров таблиц выполните необходимые изменения.
Работа с пустыми значениями в объектах TableAdapter
Параметрами объекта TableAdapter могут быть значения null, например:
SELECT
*
FROM
person
WHERE
(date >@date) OR
(date
IS NULL)
Если бы это был запрос в объекте TableAdapter, то можно было бы запросить все данные о сотрудниках с незаполненной информацией по дате рлждения с помощью команды
personTableAdapter.FillByDate(sotrudnicDataSet1.person,
null);
Чтобы обеспечить принятие запросом значения null
В окне Конструктор наборов данных выберите запрос TableAdapter, который должен принимать значения null для параметров.
В окне Свойства выберите Parameters и нажмите кнопку с многоточием (…), чтобы открыть Редактор коллекции параметров.
Выберите параметр, который допускает значения null, и присвойте свойству AllowDbNull значение true.
Программное создание экземпляра TableAdapter:
БДTableAdapters.ТаблицаTableAdapter имя_адаптера;
Имя_адаптера = new БДTableAdapters.ТаблицаTableAdapter();
Чтобы выполнить запрос TableAdapter, заполняющий существующую таблицу данных вызовите запрос Fill или FillBy элемента TableAdapter и передайте в качестве аргумента таблицу данных для заполнения:
ТаблицаTableAdapter.Fill(БД.Таблица);
Для выполнения запроса TableAdapter, возвращающего новую таблицу данных вызовите запрос GetData или GetDataBy элемента TableAdapter для возврата таблицы типизированных данных, заполненной результатами выполнения запроса:
БД.ТаблицаDataTable имя_новой_таблицы;
Имя_новой_таблицы = ТаблицаTableAdapter.GetData();
Компонент TableAdapterManager
TableAdapterManager — это компонент, который предоставляет функции сохранения данных в соответствующих таблицах данных. TableAdapterManager использует связи внешнего ключа, которые связывают таблицы данных для определения правильного порядка отправки команд Insert, Update и Delete из набора данных в базу данных без нарушения ограничения ссылочной целостности в базе данных.
Общий процесс сохранения данных в связанных таблицах данных с помощью TableAdapterManager называется Иерархическое обновление.
По умолчанию, класс TableAdapterManager создается при создании типизированного набора данных в проекте.
Методы и свойства TableAdapter
Ниже перечислены часто используемые методы и свойства класса TableAdapterManager:
Член |
Описание |
Метод UpdateAll |
Сохраняет все данные из всех таблиц данных. |
Свойство BackUpDataSetBeforeUpdate |
Логическое
значение.
Определяет,
требуется ли создавать резервную
копию набора данных перед выполнением
метода |
Свойство TableAdapter |
Созданный TableAdapterManager содержит свойство для каждого TableAdapter, которым он управляет. Например, набор данных с таблицей person и worker создается с TableAdapterManager, содержащий свойства personTableAdapter и workerTableAdapter:
|
Свойство UpdateOrder |
Определяет
порядок выполнения отдельных команд
INSERT, UPDATE и DELETE.
Установите
это свойство в одно из значений
перечисления По умолчанию UpdateOrder имеет значение InsertUpdateDelete. Это означает, что вставки выполняются для всех таблиц в наборе данных, затем выполняются обновления для всех таблиц в наборе данных, и затем удаление. |
Компонент DataTable
Представляет одну таблицу с данными в памяти.
Если объект DataTable создается программно, необходимо сначала определить его схему, добавив объекты DataColumn в коллекцию DataColumnCollection (доступна через свойство Columns).
Чтобы добавить строки в объект DataTable, необходимо сначала вернуть новый объект DataRow с помощью метода NewRow. Метод NewRow возвращает строку со схемой объекта DataTable, согласно тому, как она определена в коллекции DataColumnCollection таблицы. Максимальное количество строк, которое может храниться в объекте DataTable, равно 16 777 216.
Для добавления новой таблицы данных в набор данных:
Перетащите DataTable из вкладки Набор данныхПанели элементов в Конструктор наборов данных.
К набору данных будет добавлена таблица с именем DataTable1.
Щелкните полосу заголовка DataTable1 и переименуйте новый компонент.
Для добавления столбцов в таблицу данных:
Щелкните правой кнопкой мыши по таблице DataTable1. В открывшемся контекстном меню выберите Добавить, а затем щелкните Столбец.
Назовите столбец.
В окне Свойства присвойте свойству DataType значение типа.
Повторите эти действия, чтобы добавить следующие столбцы:
Для задания первичного ключа таблицы щелкните правой кнопкой мыши по столбцу первичного ключа и щелкните по пункту Задать первичный ключ. Значок ключа появится рядом с выбранным столбцом.
Методы DataTable
Ниже перечислены часто используемые методы класса DataTable:
Член |
Описание |
Метод NewRow |
Создает новый класс DataRow, имеющий ту же схему, что и таблица. |
Метод AcceptChanges |
Фиксирует все изменения, внесенные в таблицу после последнего вызова метода AcceptChanges. При вызове метода AcceptChanges успешно завершается изменение объектов DataRow, находящихся в режиме изменения. Свойство DataRowState также изменяется: все строки Added и Modified становятся Unchanged, а строки Deleted удаляются. |
Метод Load |
Это перегруженный метод, который в своей простейшей форме имеет единственный параметр, DataReader. В этой форме он просто загружает строки в таблицу DataTable. |
Компонент BindingSource
Компонент BindingSource служит двум целям.
Во-первых, обеспечивается уровень косвенного обращения при выполнении привязки к данным элементов управления в форме. Это достигается путем привязки компонента BindingSource в источнику данных, и последующей привязкой элементов управления в форме к компоненту BindingSource. Все последующие взаимодействия с данными, включая перемещение, сортировку, фильтрацию и обновление, осуществляются с помощью обращения к компоненту BindingSource.
Во-вторых, компонент BindingSource может действовать как строго типизированный источник данных.
Компонент DataRelation
Представляет отношение "родительский/дочерний объект" между двумя объектами DataTable.
Отношение DataRelation используется для связи двух объектов DataTable между собой с помощью объектов DataColumn. Например, в отношении "Сотрудник-Работа" таблица "person" является родительской, а таблица "worker" — дочерней. Это похоже на отношение первичный ключ/внешний ключ.
Объект DataRelation выполняет две функции:
Открывает доступ к записям, связанным с рабочей записью. Предоставляет дочерние записи при работе с родительскими (GetChildRows) и наоборот — предоставляет родительские записи при работе с дочерними (GetParentRow ).
Вводит ограничения для обеспечения целостности данных, например, удаление связанной дочерней записи при удалении родительской записи.
Отношения создаются соответствующими столбцами в родительской и дочерней таблице. То есть значение DataType для обоих столбцов должно быть идентичным.
В следующем примере выполняется создание нового DataRelation и добавление его в коллекцию DataRelationCollection объекта DataSet.
private void CreateRelation()
{
DataColumn parentColumn =
sotrudnicDataSet1.Tables["person"].Columns["pasport"];
DataColumn childColumn =
sotrudnicDataSet1.Tables["worker"].Columns["pasport"];
// Создание DataRelation.
DataRelation rel;
rel = new DataRelation("person_worker", parentColumn,
childColumn);
// Добавление отношения в БД.
sotrudnicDataSet1.Relations.Add(rel);
}
Важно понимать разницу между реальным объединением и использованием функции объекта DataRelation. При реальном объединении записи берутся из родительской и дочерней таблиц и помещаются в один плоский набор записей. При использовании объекта DataRelation новый набор записей не создается. Вместо этого отслеживаются отношения между таблицами и поддерживается синхронизация родительских и дочерних записей.
DataColumn - класс
Представляет схему столбца в таблице DataTable.
DataColumn — базовый строительный блок для создания схемы DataTable. Построение схемы выполняется посредством добавлением одного или нескольких объектов DataColumn в DataColumnCollection.
Каждый столбец DataColumn имеет свойство DataType, определяющее, какие данные содержатся в столбце DataColumn. Например, можно ограничить данные типами "целое число", "строка" или "десятичное число". Так как данные, содержащиеся в DataTable, обычно объединяются с исходным источником данных, необходимо сопоставить типы данных типам в источнике данных.
Такие свойства, как AllowDBNull, Unique и ReadOnly, устанавливают ограничения на ввод и обновление данных, тем самым помогая обеспечить целостность данных. Также можно использовать свойства AutoIncrement, AutoIncrementSeed и AutoIncrementStep для управления автоматическим созданием данных.
Можно обеспечить уникальность значений в DataColumn путем создания UniqueConstraint и его добавления в ConstraintCollection объекта DataTable, к которому принадлежит столбец DataColumn.
Можно использовать свойство Expression объекта DataColumn для расчета значений в столбце либо создать составной столбец.
В следующем примере создается таблица DataTable с несколькими столбцами DataColumn.
private void MakeTable()
{
// Создание DataTable.
DataTable table = new DataTable("person");
// Создание DataColumn и его свойств.
DataColumn column = new DataColumn();
column.DataType =
System.Type.GetType("System.String");
column.AllowDBNull = false;
column.Caption = "Фамилия";
column.ColumnName = "fio";
column.DefaultValue = 25;
// Добавление столбца в таблицу.
table.Columns.Add(column);
//Создание строки значений.
DataRow row;
row = table.NewRow();
row["fio"] = «Иванов А.С.»;
// Добавление строки в таблицу.
table.Rows.Add(row);
}
DataRow - класс
Представляет строку данных в DataTable.
Объекты DataRow и DataColumn являются первичными компонентами DataTable. Объект DataRow и его свойства и методы применяются для извлечения и оценки, вставки, удаления и обновления значений в DataTable. Коллекция DataRowCollection представляет фактические объекты DataRow в DataTable, а коллекция DataColumnCollection содержит объекты DataColumn, которые описывают схему DataTable. Для возвращения или задания значения DataColumn следует использовать свойство Item.
Свойства HasVersion и IsNull применяются для определения состояния какого-либо конкретного значения строки, а свойство RowState – для определения состояния строки относительно его родительского объекта DataTable.
Для создания нового объекта DataRow используется метод NewRow объекта DataTable. После создания объекта DataRow используется метод Add для добавления нового объекта DataRow в DataRowCollection. Наконец, метод AcceptChanges объекта DataTable применяется для подтверждения операции добавления.
Возможно удаление объекта DataRow из коллекции DataRowCollection посредством вызова метода Remove объекта DataRowCollection либо вызова метода Delete объекта DataRow. Метод Remove удаляет строку из коллекции. Метод Delete, напротив, помечает объект DataRow для удаления. Фактическое удаление происходит при вызове метода AcceptChanges. Вызвав метод Delete, можно программными средствами проверить, какие строки помечены для удаления, прежде чем выполнять их фактическое удаление.
DataSet - класс
Представляет расположенный в памяти кэш данных, загружаемых из источника данных. Класс DataSet состоит из коллекции таблиц DataTable, которые можно связать между собой с помощью объектов класса DataRelation. Кроме того, для обеспечения целостности данных в классе DataSet можно использовать объекты UniqueConstraint и ForeignKeyConstraint.
Класс DataRelationCollection позволяет перемещаться по структуре таблиц с объектами DataTable. Доступ к таблицам коллекции DataTableCollection осуществляется с помощью свойства Tables. При доступе к объектам DataTable следует учитывать их зависимость от регистра знаков.
Чтение и запись данных и схем в класс DataSet осуществляется также, как запись и чтение XML-документов. Данные и схемы можно передавать по протоколу HTTP и использовать в любом приложении на любой платформе, поддерживающей формат XML. С помощью метода WriteXmlSchema схему можно сохранить в качестве XML-схемы. Кроме того, схему и данные можно также сохранить, используя метод WriteXml. Для чтения XML-документа, содержащего данные и схемы, служит метод ReadXml.
Лабораторная работа №1
Создание базы данных «Офисная техника»
Цель. Приобрести навыки по созданию базы данных из нескольких таблиц.
Задание.Cоздайте базу данных «Офисная техника» из таблиц, представленных в приложении. Создать ограничение ссылочной целостности между таблицами.
Лабораторная работа №2
Отображение данных на форме
Цель. Освоить способы отображения данных в приложении.
Задание.
Создайте главную титульную форму. Поменяйте для этой формы фон (можно с рисунком). Установиеь жесткие границы, организуйте вывод названия приложения на форме и в строке заголовка.
Создайте на форме программное меню с опциями «Таблицы», «Выход».
Состав опции «Таблицы»:
а) Просмотр таблицы Product
б) Просмотр таблицы PC
в) Просмотр таблицы Laptop
г) Просмотр таблицы Printer
д) Отображение всех данных БД в единой таблице.
е) Связанные курсоры (All tables).
Создайте дополнительные дочерние формы и отобразите на них таблицы в соответствие с командами опции «Таблицы».
На все формы добавьте панели навигации с кнопками перехода между записями.
