- •1. Язык программирования c# 3
- •2. Базовые элементы .Net Framework 67
- •3. ТЕхнология .Net Remoting 144
- •Введение
- •1. Язык программирования c#
- •1.1. Платформа .Net – обзор архитектуры
- •1.2. Язык c# - общие концепции синтаксиса
- •1.3. Система типов языка c#
- •1.4. Преобразования типов
- •1.5. Идентификаторы, ключевые слова и литералы
- •1.6. Объявление переменных, полей и констант
- •1.7. Выражения и операции
- •1.8. Операторы языка c#
- •1.9. Объявление и вызов методов
- •1.10. Массивы в c#
- •1.11. Работа с символами и строками в c#
- •1.12. Синтаксис объявления класса, Поля и методы класса
- •1.13. Свойства и индексаторы
- •1.14. Конструкторы класса и Жизненный цикл объекта
- •1.15. Наследование классов
- •1.16. Перегрузка операЦий
- •1.17. Делегаты
- •1.18. События
- •1.19. Интерфейсы
- •1.20. Структуры и перечисления
- •1.21. Пространства имен
- •1.22. Генерация и обработка исключительных ситуаций
- •1.23. Нововведения в языке c# 2.0
- •1.24. Обобщенные типы (generics)
- •2. Базовые элементы .Net Framework
- •2.1. Метаданные и механизм отражения
- •2.2. Пользовательские и встроенные атрибуты
- •2.3. Пространство имен system.Collections
- •2.4. Работа с файлами и директориями
- •2.5. Использование потоков данных
- •2.6. Сериализация
- •2.7. Сериализация объектов в нестандартном формате
- •2.8. Введение в xml
- •2.9. Работа с xml-документами в .Net framework
- •2.10. МНогопоточное программирование
- •2.11. Синхронизация потоков
- •2.12. Асинхронный вызов методов
- •2.13. Состав и взаимодействие сборок
- •2.14. Конфигурирование сборок
- •3. ТЕхнология .Net Remoting
- •3.1. Домены приложений
- •3.2. Архитектура .Net Remoting
- •3.3. Активация удаленных объектов и их время жизни
- •3.4. Программная настройка Remoting
- •3.5. Удаленные Объекты с клиентской активацией
- •3.6. Настройка Remoting при помощи конфигурационных файлов
- •3.7. Хостинг распределенных приложений
- •3.8. Объекты-сообщения
- •3.9. Пользовательские канальные приемники
- •4.1. Архитектура ado.Net
- •4.2. Учебная база cd Rent
- •4.3. Соединение с базой данных
- •4.4. Выполнение команд и запросов к базе данных
- •4.5. Чтение данных и объект DataReader
- •4.6. Параметризированные запросы
- •4.7. Рассоединенный набор данных
- •4.8. Заполнение Рассоединенного набора данных
- •4.9. Объект класса DataColumn – колонка таблицы
- •4.10. Объекты класса DataRow – строки таблицы
- •4.11. Работа с объектом класса DataTable
- •4.12. DataSet и схема рассоединенного набора данных
- •4.13. Типизированные DataSet
- •4.14. Поиск и фильтрация данных в DataSet
- •4.15. Класс DataView
- •4.16. СиНхронизация набора данных и базы
- •5.1. Архитектура и общие концепции asp.Net
- •5.2. Пример aspx-страницы. Структура страницы
- •5.3. Директивы страницы
- •5.4. Класс System.Web.Ui.Page. События страницы
- •5.5. Серверные элементы управления
- •5.6. Элементы управления Web Controls
- •5.7. Проверочные элементы управления
- •5.8. Списковые элементы управления
- •5.9. Связывание данных
- •5.11. Управление состояниями в web-приложениях
- •5.12. Кэширование
- •5.13. Безопасность в web-приложениях
- •5.14. Создание пользовательских элементов управления
- •Литература
4.15. Класс DataView
Метод DataTable.Select() – очень мощный и гибкий, но не является оптимальным решением для всех ситуаций. У него есть два основных ограничения. Во-первых, метод принимает динамические критерии поиска и поэтому не может быть сверхэффективным. Во-вторых, Windows- и Web-формы не поддерживают связывание с возвращаемым значением метода Select() – массивом объектов DataRow. В ADO.NET предусмотрено решение, обходящее оба этих ограничения – объект класса DataView.
Объекты DataView позволяют фильтровать, сортировать и вести поиск в содержимом таблиц. Объекты DataView не являются SQL-запросами, в отличие от представлений (view) в базах данных. С помощью DataView нельзя объединить данные двух таблиц, равно как и просмотреть отдельные столбцы таблицы. Объекты DataView поддерживают фильтрацию запросов на основе динамических критериев, но разрешают обращаться только к одному объекту DataTable; кроме того, через DataView всегда доступны все столбцы таблицы. У объекта DataView нет собственной копии данных. При обращении через DataView к данным он возвращает записи, хранящиеся в соответствующем объекте DataTable.
Чтобы просмотреть с помощью объекта DataView данные некоторой таблицы, его следует связать с этой таблицей. Есть два способа сделать это: используя свойство Table объекта DataView или при помощи конструктора DataView. Следующие фрагменты эквивалентны:
DataTable dt = CD_Rent.Tables["Disks"];
// Первый вариант
DataView dv = new DataView();
dv.Table = dt;
// Второй вариант
DataView dv = new DataView(dt);
У DataView также есть конструктор, сигнатура которого более точно соответствует методу DataTable.Select(). Этот конструктор задает значения свойств Table, RowFilter, Sort и RowStateFilter объекта DataView в одной строке кода. Следующие варианты кода эквивалентны:
DataTable dt = CD_Rent.Tables["Disks"];
// Первый вариант
DataView dv = new DataView();
dv.Table = dt;
dv.RowFilter = "release_year = 2005";
dv.Sort = "title DESC";
dv.RowStateFilter = DataViewRowState.ModifiedOriginal;
// Второй вариант
DataView dv = new DataView(dt, "release_year = 2005",
"title DESC",
DataViewRowState.ModifiedOriginal);
Свойство RowStateFilter принимает значения из перечисления DataViewRowState. Это перечисление можно рассматривать как комбинацию свойства RowState объекта DataRow и перечисления DataRowVersion.
Added – отображаются добавленные строки;
CurrentRows – отображаются строки, которые не были удалены (значение по умолчанию);
Deleted – отображаются удаленные строки;
ModifiedCurrent – отображаются измененные строки с их текущими значениями;
ModifiedOriginal – отображаются измененные строки с их оригинальными значениями;
None – строки не отображаются;
OriginalRows – отображаются удаленные, измененные и не изменявшиеся строки с их оригинальными значениями;
Unchanged – отображаются строки, которые не изменялись.
Свойство RowStateFilter работает в качестве двойного фильтра. Например, если задать ему значение ModifiedOriginal, через объект DataView окажутся доступны только измененные записи, и вы будете видеть их оригинальные значения.
Объект DataView возвращает данные с помощью собственного специализированного объекта – DataRowView. Функциональность DataRowView в целом аналогична функциональности DataRow. DataRowView обладает свойством Item, позволяющим обращаться к содержимому поля как по имени, так и по порядковому номеру. И хотя свойство Item разрешает просматривать и изменять содержимое поля, через DataRowView доступна только одна версия данных строки – та, которая указана при помощи свойства DataRowVersion. Если объект DataRowView не обеспечивает требуемых возможностей, обратитесь при помощи свойства Row этого объекта к соответствующему объекту DataRow из таблицы.
Доступ к данным объекта DataTable при помощи DataView осуществляется иначе, чем непосредственный доступ к объекту DataTable. Таблица предоставляет свои строки через свойство Rows. У DataView нет похожего, допускающего простое перечисление, набора. DataView имеет свойство Count, возвращающее число строк, и индексатор Item с целым индексом. Используя эти свойства, можно создать простой цикл для просмотра всех строк:
DataView dv = new DataView(dt, "release_year = 2005",
"title DESC",
DataViewRowState.CurrentRows);
for (int i = 0; i < dv.Count; i++) {
DataRowView drv = dv[i];
Console.WriteLine(drv["title"]);
}
Класс DataView предоставляет методы Find() и FindRows(), позволяющие искать в нем данные. Эти методы аналогичны методу Find() коллекции Rows таблицы. Задав значение свойства Sort объекта DataView, вы получите возможность с помощью метода Find() искать строки по значениям столбцов, перечисленных в свойстве Sort. Как и в случае с методом DataRowCollection.Find(), одноименному методу DataView разрешено передавать одно значение или массив значений. Тем не менее, метод DataView.Find() возвращает не объект DataRow или DataRowView, а значение целого типа, соответствующее порядковому номеру нужной строки в объекте DataView. Если искомая строка не найдена, метод вернет -1:
DataTable dt = CD_Rent.Tables["Disks"];
DataView dv = new DataView(dt);
dv.RowFilter = "release_year = 2005";
dv.Sort = "title";
int findIndex = dv.Find("Mezmerize");
if (findIndex != -1)
Console.WriteLine(dv[findIndex]["artist_id"]);
Метод DataView.Find() осуществляет поиск по столбцам, указанным в свойстве Sort. У многих строк могут быть одинаковые значения полей, используемых для сортировки данных. Например, при сортировке дисков по полю release_year это поле может иметь значение "2005" для нескольких строк. Тем не менее, найти посредством метода Find() все диски, выпущенные в 2005 году нельзя, поскольку он возвращает только целочисленное значение. К счастью, класс DataView предоставляет метод FindRows(). Его вызывают так же, как и метод Find(), но метод FindRows() возвращает массив объектов DataRowView, содержащих строки, которые удовлетворяют критериям поиска.
DataTable dt = CD_Rent.Tables["Disks"];
DataView dv = new DataView(dt);
dv.RowFilter = "release_year = 2005";
dv.Sort = "release_year";
DataRowView[] res = dv.FindRows("2005");
if (res.Length != 0)
Console.WriteLine("Find {0} rows", res.Length);
Строка данных модифицируется с помощью объекта DataRowView аналогично изменению содержимого объекта DataRow. Объект DataRowView, как и DataRow, предоставляет методы BeginEdit(), EndEdit(), CancelEdit() и Delete(). Создание новой строки данных при помощи объекта DataRowView несколько отличается от создания нового объекта DataRow. У класса DataView есть метод AddNew(), возвращающий новый объект DataRowView. В действительности же новая строка добавляется в базовый объект DataTable только при вызове метода EndEdit() объекта DataRowView. Ниже показано, как средствами объекта DataRowView создать, изменить и удалить строку данных:
// Создание новой строки с использованием DataView
DataRowView drv = dv.AddNew();
drv[0] = 10;
drv[1] = "Hipnotize";
drv.EndEdit();
// Получение и редактирование строки
drv = dv[1];
drv.BeginEdit();
drv[1] = "H";
drv.EndEdit();
// Получение и удаление строки
drv = dv[0];
drv.Delete();
В таблице 35 приведено краткое описание основных свойств и методов класса DataView.
Таблица 35
Свойства и методы класса DataView
Имя свойства или метода |
Описание |
AddNew() |
Создает новый объект DataRowView |
AllowDelete AllowEdit AllowNew |
Булевы свойства; указывают, допустимо ли удаление, изменение или добавление записей в объект DataView |
ApplyDefaultSort |
Если задать свойству значение true, содержимое DataView сортируется по первичному ключу таблицы, связанной с DataView. Кроме того, если изменить значение свойства на true, свойству Sort будут заданы столбцы, составляющие первичный ключ связанной таблицы |
BeginInit() |
Временно кэширует изменения содержимого DataView |
CopyTo() |
Позволяет копировать объекты DataRowView, доступные через DataView, в массив |
Count |
Возвращает число записей в DataView (доступно только для чтения) |
Delete() |
Метод принимает порядковый номер строки в объекте DataView и удаляет эту строку из базового объекта DataTable |
EndInit() |
Подтверждает внесение кэшированных изменений в DataView |
Find() |
Выполняет в DataView поиск отдельной строки данных |
FindRows() |
Выполняет в DataView поиск нескольких строк данных |
GetEnumerator() |
Возвращает экземпляр объекта IEnumerator для просмотра строк DataView |
Item |
Индексатор, возвращает объекты DataRowView, доступные через DataView |
RowFilter |
Свойство аналогично разделу WHERE SQL-запроса. Через DataView доступны только строки, удовлетворяющие заданному в свойстве критерию. Значение свойства по умолчанию – пустая строка |
RowStateFilter |
Указывает, какие строки доступны через объект DataView, а также версию этих строк |
Sort |
Свойство определяет порядок сортировки данных, доступных через DataView, и функционирует аналогично разделу ORDER BY SQL-запроса |
Table |
Таблица, с которой связан объект DataView |