Лекція №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. Системи управління знаннями

.