Лекція №13-14
Типизированные классы DataSet
Класс DataView
Обновление базы данных
Удаление записей из объектов DataTable
Создание новых строк в объектах DataTable
Для добавления новых строк в таблицу DataTable нужно добавить новые объекты DataRow в коллекцию Rows данной таблицы. Объекты DataRow представляют строки таблицы БД. Создавать объекты класса DataRow с использованием операции new нельзя, вместо этого следует вызвать метод NewRow() объекта DataTable, к которому добавляется объект DataRow. Например:
DataRow myRow ;
myRow = tbl.NewRow();
Созданный объект DataRow можно заполнить данными, введенными пользователями или полученными из любого источника данных (коллекции или массива). Для доступа к полям записи используется коллекция Item объекта DataRow. Для занесения заполненного объекта DataRow в таблицу, его нужно добавить к коллекции Rows объекта DataTable. Следующий пример показывает заполнение объекта DataRow данными и сохранение его в таблице:
DataSet ds = new DataSet();
DataTable tbl = ds.Tables["MyBooks"];
DataRow row = tbl.NewRow();
myRow ["id"] = 44;
myRow ["authir"] = "Терентьев И.А.";
myRow ["year"] = 2003;
tbl.Rows.Add(row);
Для удаления записей из таблицы можно использовать метод Remove() коллекции Rows класса DataTable. Например:
// здесь tbl объект класса DataTable
tbl.Rows.Remove(row);
Кроме этого, можно использовать метод Delete() класса DataRow. Например:
// здесь row объект класса DataRow
row.Delete();
Закончив работу с копией базы данных в объекте DataSet, можно обновить БД, вызвав метод Update() соответствующего объекта DataAdapter, с помощью которого выполянялось заполнение данной таблицы. Например:
DataSet ds = new DataSet();
// создаем и заполняем DataAdapter da
Da.Fill(ds, "Product");
// выполняем изменения таблицы Product в ds
myDataAdapter.Update(ds, "Product");
myOtherDataAdapter.Update();
В результате вызова данного метода все изменения, внесенные в объект DataSet, переносятся в реальную БД. При этом можно указать объект DataSet, DataTable или массив объектов DataRows, подлежащий обновлению:
myDataAdapter.Update(myDataSet);
myDataAdapter.Update(myDataTable);
myDataAdapter.Update(myDataRows);
Класс DataView позволяет создать разные (альтернативные) представления (view) одной и той же таблицы. Он включает дополнительные возможности для сортировки и фильтрации записей таблицы. Основными свойствами данного класса являются RowFilter (фильтр), которое задает условие отбора записей из DataTable и Sort (сортировка), которое задает правило сортировки записей (перечисление полей, по значениям которых будут упорядочиваться записи и порядок сортировки: по умолчанию – по возрастанию; если задано DESC – по убыванию). Например:
DataView view = new DataView(myDT);
view.Sort = "LastName ASC, FirstName ASC, Salary DESC";
view.RowFilter = "City = 'Томск'";
Объект класса DataView связать с элементами графического интерфейса, например, DataGridView используя свойства DataSource. Пример создания и связывания с DataView:
// создаем объект DataView для объекта DataTable
DataView view = new DataView(employee);
// задаем правила сортировки и условия фильтра отбора
view.Sort = "LastName ASC, FirstName ASC, Salary DESC";
view.RowFilter = "LastName like 'A%' and Salary > 15";
// если есть ЭУ для отображения DataGridView
dgv.DataSource = view;
Класс DataSet не являются строго типизированным, так как в нем каждый элемент данных имеет тип object. В связи с этим, для выполнения над ним любые действий, специфичных для некоторого типа, этот объект следует преобразовать в соответствующий тип (выполнять кастинг). При использовании нестрого типизированных переменных вероятны ошибки изза несоответствия типов, которые весьма непросто найти и устранить. ADO.NET также поддерживает типизированный класс DataSet, альтернатива применению нестрого типизированных переменных.
У объекта типизированного класса DataSet, как можно предположить по его названию, все элементы строго типизированы (имеют конкретный тип). На таблицы и поля такого объекта DataSet можно ссылаться по их дружественным именам, представляющим реальные имена таблиц и столбцов, с которыми выполняется работа; их значения доступны в виде значений соответствующих типов, а не объектов. Это дает приложению целый ряд преимуществ.
Вопервых, код программы становится более понятным и его удобнее сопровождать. Вовторых, ошибки изза несоответствия типов обнаруживаются в период компиляции, а не в период выполнения – это экономит время, необходимое для тестирования. Наконец, полные имена членов коллекций (например, Tables) допустимо заменять их дружественными именами, при этом в период разработки, имена типизированных членов данных отображаются в окнах среды разработки благодаря технологии Intellisense.
Ниже приводится пример эквивалентных строк кода, использующих типизированные и не типизированные объекты DataSet. Оба примера возвращают значения поля OrderID первой записи таблицы Orders в результирующем наборе dsOrders. Для не типизированного объекта DataSet получить это значение можно сделать следующим образом:
string myOrder =
(string)dsOrders.Tables["Orders"].Rows[0]["OrderID"];
А типизированных объектов DataSet выполняется так, как показано ниже:
string myOrder = dsOrders.Orders[0].OrderID;
Как видно, второй фрагмент существенно проще, более понятный и не требует явного преобразования типов. В действительности типизированный DataSet – это экземпляр совсем другого класса, производного от DataSet. Структура этого класса определяется файлом схемы
XML (XSDфайлом), в котором описаны различные особенности структуры объекта DataSet, в том числе имена таблиц и столбцов. Для создания нового типизированного объекта DataSet требуется файл схемы, но его удается создать, только если структура данных, с которыми вам предстоит работать, известна заранее. Чтобы генерировать типизированный объект DataSet, нужно выполнить в Visual Studio команду Data>Add New Source.... В результате выполнения этой команды появится диалоговое окно мастера “Data Source Configuration Wizard”, с помощью которого можно создать типизированный объект DataSet. По окончанию работы с мастером будет сгенерирован XSDфайл с корректной схемой, необходимый для создания объекта DataSet.
Чтобы заполнить строго типизированный объект DataSet, используется метод Fill() каждого объекта DataAdapter, чьи данные требуется добавить в объект DataSet, передав этот DataSet при вызове как целевой объект.
з навчальної дисципліни
«ІНТЕЛЕКТУАЛЬНІ СИСТЕМИ ЗАХИСТУ ІНФОРМАЦІЇ В ІНФОРМАЦІЙНО-КОМУНІКАЦІЙНИХ СИСТЕМАХ»
Модуль 3. «Технології побудови інтелектуальних систем захисту інформації»
ТЕМА 10. Системи управління знаннями
.