Опубликован: 07.05.2010 | Доступ: свободный | Студентов: 1678 / 62 | Оценка: 4.56 / 4.06 | Длительность: 34:11:00
Лекция 12:

Компоненты данных 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
Метод Описание
Clear() Очищает все данные таблиц, но не трогает информацию о схеме и отношениях
Copy() Возвращает точный дубликат DataSet с тем же набором таблиц, данных и отношений
Clone() Возвращает DataSet с той же структурой (таблицами и отношениями), но без данных
Merge() Принимает на входе другой DataSet и объединяет его с текущим DataSet, добавляя новые таблицы и объединяя данные в существующих
GetXml(), GetXmlSchema() Возвращают строку данных в формате XML или информацию схемы для DataSet. Информация схемы - это структурированная информация наподобие количества таблиц, их имен, столбцов, типов данных и установленных отношений
ReadXml(), ReadXmlSchema() Создают таблицы в DataSet на основе существующего документа XML или документа схемы XML. Источником XML может быть файл или другой поток
WriteXml(), WriteXmlSchema() Сохраняют данные и схемы DataSet в файле или потоке формата XML

Класс DataSet является сердцем автономного доступа к данным. Он содержит в себе в виде классов-свойств коллекцию из нуля или более таблиц и коллекцию из нуля или более отношений между таблицами. Базовая структура DataSet приведена на рисунке.


Каждая запись DataSet представлена как объект DataRow. DataRow - это контейнер для действительных значений полей. К полям записи можно обращаться через объект DataRow как к ассоциативному массиву, используя в качестве ключа имена полей, например, myRow["FieldName"].

Все версии измененных строк при редактировании сохраняются в DataSet для возможности отката. Удаленные или добавленные строки также помечаются соответствующим образом. Следует помнить, что информация в физическом источнике данных не затрагивается вообще при работе с DataSet, а все изменения производятся в виртуальном источнике оперативной памяти.