Компоненты данных ADO.NET
Тестовая страница для испытания компонента доступа к данным
Весь код класса-оболочки, который мы разработали выше, теперь нужно испытать на тестовой странице.
- Добавьте к проекту (в корень Web-дерева) новую страницу с разделяемым кодом и именем TestComponent.aspx
- Добавьте на страницу компонент Label и дайте ему имя lblInfo
-
Откройте на редактирование файл поддержки TestComponent.aspx.cs и наполните его следующим кодом
using System; using System.Text; using System.Collections.Generic; public partial class TestComponent : System.Web.UI.Page { // Создать компонент базы данных private EmployeeDB db = new EmployeeDB(); protected void Page_Load(object sender, EventArgs e) { lblInfo.Text = "<h2>Исходная таблица</h2>"; WriteEmployeesList(); int empID = db.InsertEmployee( new EmployeeDetails(0, "Алексей", "Зиборов", "Ст.")); lblInfo.Text += "<h2>Вставлена 1 запись.</h2>"; WriteEmployeesList(); db.DeleteEmployee(empID); lblInfo.Text += "<h2>Удалена 1 запись.</h2>"; WriteEmployeesList(); } private void WriteEmployeesList() { StringBuilder htmlStr = new StringBuilder(""); List<EmployeeDetails> employees = db.GetAllEmployees(); foreach (EmployeeDetails emp in employees) { htmlStr.Append("<li>"); htmlStr.Append(emp.EmployeeID); htmlStr.Append(" "); htmlStr.Append(emp.TitleOfCourtesy); htmlStr.Append(" <b>"); htmlStr.Append(emp.FirstName); htmlStr.Append("</b>, "); htmlStr.Append(emp.LastName); htmlStr.Append("</li>"); } int numEmployees = db.CountEmployees(); htmlStr.Append("<hr />Число записей: <b>"); htmlStr.Append(numEmployees.ToString()); htmlStr.Append("</b><br /><br />"); lblInfo.Text += htmlStr.ToString(); } }
- Назначьте страницу TestComponent.aspx стартовой и исполните ее. Должен получиться примерно такой результат
Исходная таблица
- 1 Ms. Nancy, Davolio
- 2 Dr. Andrew, Fuller
- 3 Ms. Janet, Leverling
- 4 Mrs. Margaret, Peacock
- 5 Mr. Steven, Buchanan
- 6 Mr. Michael, Suyama
- 7 Mr. Robert, King
- 8 Ms. Laura, Callahan
- 9 Ms. Anne, Dodsworth
Число записей: 9
Вставлена 1 запись.
- 1 Ms. Nancy, Davolio
- 2 Dr. Andrew, Fuller
- 3 Ms. Janet, Leverling
- 4 Mrs. Margaret, Peacock
- 5 Mr. Steven, Buchanan
- 6 Mr. Michael, Suyama
- 7 Mr. Robert, King
- 8 Ms. Laura, Callahan
- 9 Ms. Anne, Dodsworth
- 99 Ст. Алексей, Зиборов
Число записей: 10
Удалена 1 запись.
- 1 Ms. Nancy, Davolio
- 2 Dr. Andrew, Fuller
- 3 Ms. Janet, Leverling
- 4 Mrs. Margaret, Peacock
- 5 Mr. Steven, Buchanan
- 6 Mr. Michael, Suyama
- 7 Mr. Robert, King
- 8 Ms. Laura, Callahan
- 9 Ms. Anne, Dodsworth
Число записей: 9
Мы видим, что все работает как надо. Обратите внимание, что значение поля EmployeeID прирастает на 1 при повторных запусках тестовой страницы. Это значит, что физически запись не удаляется, а только помечается на удаление SQL-запросом DELETE, а поле имеет установку для СУБД SQL Server, которая является посредником в нашем коде доступа к данным, автоматически увеличивать значение счетчика.
Библиотечный класс DataSet и автономные данные
До сих пор мы рассматривали код, который работает непосредственно с физическими данными, хранящимися в базе данных, удерживая соединение на весь период обработки. Такой режим называется присоединенным. Но более практическим будет подход, когда пользователь работает с данными в отсоединенном режиме, кратковременно подключаясь к базе только для загрузки или выгрузки данных.
Для таких целей применяется объект DataSet, который наполняется копией информации, прочитанной из базы, и далее служит виртуальным источником данных, хранящимся в оперативной памяти. Мы можем вносить необходимые изменения в данные, которые никак не отражаются в базе до тех пор, пока мы повторно не соединимся с ней для записи измененных данных.
DataSet имеет методы, которые могут читать и писать данные и схемы XML, методы для быстрой очистки и дублирования данных. Некоторые из этих методов приведены в таблице.
Класс DataSet является сердцем автономного доступа к данным. Он содержит в себе в виде классов-свойств коллекцию из нуля или более таблиц и коллекцию из нуля или более отношений между таблицами. Базовая структура DataSet приведена на рисунке.
Каждая запись DataSet представлена как объект DataRow. DataRow - это контейнер для действительных значений полей. К полям записи можно обращаться через объект DataRow как к ассоциативному массиву, используя в качестве ключа имена полей, например, myRow["FieldName"].
Все версии измененных строк при редактировании сохраняются в DataSet для возможности отката. Удаленные или добавленные строки также помечаются соответствующим образом. Следует помнить, что информация в физическом источнике данных не затрагивается вообще при работе с DataSet, а все изменения производятся в виртуальном источнике оперативной памяти.