
- •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.11. Работа с объектом класса DataTable
Любой рассоединенный набор данных содержит одну или несколько таблиц. В данном параграфе рассматривается настройка отдельной таблицы, ее свойства и методы.
Наиболее важные свойства класса DataTable приведены в таблице 29.
Таблица 29
Свойства класса DataTable
Имя свойства |
Описание |
CaseSensitive |
Определяет, учитывается ли регистр при поиске строк в таблице (по умолчанию false – не учитывается) |
ChildRelations |
Возвращает коллекцию подчиненных связей для таблицы |
Columns |
Набор столбцов таблицы |
Constraints |
Набор ограничений, заданных для таблицы |
DataSet |
Рассоединенный набор данных, включающий таблицу |
DefaultView |
Указывает на представление по умолчанию (view) для таблицы |
ExtendedProperties |
Коллекция пользовательских свойств таблицы |
HasErrors |
Указывает, содержит ли таблица ошибки |
Locale |
Свойство имеет тип CultureInfo и определяет региональные параметры, используемые таблицей при сравнении строк |
MinimumCapacity |
Служит для получения или установки исходного количества строк таблицы (по умолчанию – 25 строк) |
ParentRelations |
Коллекция родительских отношений для таблицы |
PrimaryKey |
Массив столбцов, формирующих первичный ключ таблицы |
Rows |
Набор строк таблицы |
TableName |
Строка с именем таблицы |
Если требуется вручную создать таблицу, то можно воспользоваться конструктором класса DataTable. Конструктор имеет перегруженную версию, которая позволяет установить имя таблицы – свойство TableName:
DataTable dt = new DataTable();
dt.TableName = "Main Table";
// аналогичный результат:
DataTable dt = new DataTable("Main Table");
Работа со свойствами Columns и Rows обсуждалась ранее. Свойства ChildRelations, ParentRelations, Constraints и PrimaryKey будут рассмотрены в следующем параграфе. При помощи свойства DataSet таблица связывается с определенным набором данных. Работа со свойством ExtendedProperties аналогична примерам, приводимым для класса DataColumn. Свойство таблицы HasErrors устанавливается в true, если хотя бы у одной из строк таблицы свойство HasErrors = true.
Кроме набора свойств, класс DataTable обладает следующими методами, перечисленными в таблице 30.
Таблица 30
Методы класса DataTable
Имя метода |
Описание |
AcceptChanges() |
Метод фиксирует все изменения данных в строках таблицы, которые были проделаны с момента предыдущего вызова AcceptChanges() |
BeginLoadData() |
Отключает все ограничения при загрузке данных |
Clear() |
Уничтожаются все строки таблицы |
Clone() |
Метод клонирует структуру таблицы и возвращает таблицу без строк |
Compute() |
Метод применяет строку-выражение, заданную в качестве параметра, к диапазону строк таблицы |
Copy() |
Метод клонирует и структуру, и данные таблицы |
EndLoadData() |
Активирует ограничения после загрузки данных |
GetChanges() |
Метод возвращает таблицу с идентичной схемой, содержащую изменения, которые еще не зафиксированы методом AcceptChanges() |
GetErrors() |
Возвращает массив объектов DataRow, которые нарушают ограничения таблицы |
ImportRow() |
В таблицу вставляется строка, указанная в качестве параметра метода |
LoadDataRow() |
Добавляет или обновляет строку таблицы, основываясь на содержимом массива-параметра |
NewRow() |
Создается пустая строка по схеме столбцов таблицы |
RejectChanges() |
Метод отменяет изменения, которые еще не зафиксированы вызовом AcceptChanges() |
Reset() |
Восстанавливает оригинальное состояние объекта DataTable, в котором он находился до инициализации |
Select() |
Возвращает массив строк таблицы на основании заданного критерия поиска |
Рассмотрим некоторые методы таблицы подробнее. Если в таблицу добавляется группа строк (объектов DataRow), то для повышения производительности кода следует применить методы BeginLoadData() и EndLoadData(). При вызове метода BeginLoadData() отключаются определенные на таблице ограничения. Активировать их можно, вызвав метод EndLoadData(). Если в таблице есть строки, нарушающие какие-либо ограничения, при вызове метода EndLoadData() генерируется исключение ConstraintException. Чтобы определить, какие именно строки нарушают ограничения, следует просмотреть массив, возвращаемый методом GetErrors().
Метод Clear() позволяет удалить из таблицы все строки. Вызвать его быстрее, чем освободить оригинальный и создать новый объект DataTable с идентичной структурой.
Метод Compute() позволяет выполнять агрегатные запросы к отдельным столбцам таблицы на основе заданных критериев поиска1. Метод принимает два строковых параметра. Первый содержит выражение для вычисления2, второй является фильтром, отбирающим некий диапазон строк таблицы. Следующий пример кода загружает из базы CD_Rent таблицу Rent и вычисляет средний рейтинг диска с disk_id = 1:
SqlDataAdapter da = new SqlDataAdapter("SELECT * FROM Rent",
"Server=(local);Database=CD_Rent;Integrated Security=SSPI");
DataTable Rent = new DataTable("Rent");
da.Fill(Rent);
double r = (double) Rent.Compute("Avg(disk_rating)", "disk_id = 1");
Console.WriteLine(r);
Группа методов используется для добавления в таблицу новых строк. Метод таблицы ImportRow() принимает объект-строку и добавляет его в таблицу. Метод LoadDataRow() принимает в качестве первого аргумента массив, элементы которого соответствуют элементам коллекции Columns таблицы. Метод пытается найти в таблице строку, соответствующую своему первому аргументу и обновить ее. Если строка не найдена, она создается. Второй аргумент метода LoadDataRow() – это логическое значение, управляющее свойством RowState нового объекта DataRow. Чтобы задать свойству RowState значение Added, передайте в качестве второго аргумента false; если необходимо задать значение Unmodified, передайте true. Метод LoadDataRow() возвращает ссылку на созданную или найденную строку. Метод NewRow() возвращает для таблицы новую строку, но не добавляет его в коллекцию Rows таблицы. Добавление следует осуществить вручную, предварительно заполнив необходимые поля строки. Рекомендуется следующее:
Для импорта строки из сторонней таблицы используйте метод ImportRow().
Для одновременного импорта нескольких строк, например на основе содержимого файла, применяйте метод LoadDataRow(). Это позволит вам писать меньше кода, чем при работе с методом NewRow().
Во всех остальных случаях вызывайте метод NewRow().
Любая таблица поддерживает следующий набор событий:
ColumnChanged – происходит после изменения содержимого поля некой строки;
ColumnChanging – перед изменением содержимого поля строки;
RowChanged – происходит после изменения содержимого строки;
RowChanging – генерируется перед изменением содержимого строки;
RowDeleted – происходит после удаления строки;
RowDeleting – происходит перед удалением строки.
События ColumnChanged и ColumnChanging наступают каждый раз, когда изменяется содержимое одного из полей строки. Они позволяют осуществлять проверку данных, активировать и деактивировать элементы управления, и т.д. У данных событий есть аргумент типа DataColumnChangeEventArgs, обладающий свойствами Row и Column, которые позволяют определить, какие именно поле и строка изменены. Помните: при использовании данных событий для редактирования содержимого строки иногда возникает замкнутый цикл.
События RowChanged и RowChanging наступают каждый раз, когда изменяется содержимое строки или значение свойства RowState строки. Чтобы определить, почему наступило событие, достаточно просмотреть значение свойства Action аргумента DataColumnChangeEventArgs этого события. Свойство Row указанного аргумента позволяет обращаться к изменяемой записи.
События RowDeleted и RowDeleting предоставляют такие же аргументы и свойства, как события RowChanged и RowChanging. Единственное отличие в том, что данные события наступают при удалении строки из таблицы.