Высокоуровневые методы информатики и программирования Лекция 29 Типизированные классы Dataset Типизированный класс DataSet Виды классов DataSet • Не типизированные (Untyped Dataset ) – Экземпляры класса DataSet – Можно получать таблицы только по индексу в коллекции – Можно получать поля только по индексу в коллекции • Типизированные (Typed Dataset) – Экземпляры класса производного от DataSet – Можно работать с таблицами по их названию (методы) – Можно работать с полями по их названию. – Можно создавать с помощью Data Source Designer • Типизированный data set это набор классов, которые создается декларативно с помощью дизайнера Visual Studio. • Данные классы являются производными от классов DataSet, DataTable и DataRow ADO.NET и содержат типизированное (безопасное по типу) API (набор свойств) для получения доступа к данным, которые содержатся в DataSet, имеющем конкретную схему (набор таблиц и отношений). • Типизированный data set можно создать в Visual Studio с помощью операции перетаскивания (drag and drop) и с помощью задания свойств в окне Properties. • При проектировании типизированного data set создается файл описания схемы XML (XML Schema Definition, XSD), содержащий схему данных, которые будут сохраняться в DataSet. Файл XSD также содержит аннотации, которые связаны с источником данных, из которого он будет генерироваться. • Затем Visual Studio использует файл XSD для создания программного файла, который содержит описание типизированных классов data set. Виды классов DataSet • Нетипизированный класс DataSet // salesData – объект DataSet DataTable companyTable = salesData.Tables["Company"]; // обращение к элементу "columnName" записи index salesData.Rows [index]["columnName"] • Типизированный класс DataSet (объект vendorData) DataTable companyTable = vendorData.Company; companyTable.Rows[index].columnName Типизированный класс DataSet • В данном классе для каждой таблицы создаются подклассы – Имя класса типизированных таблиц <имя DataSet>.<имя таблицы>DataTable • Свойства <Поле>Column • Индексатор this[int] возвращает типизированную строку (объект <имя таблицы>Row) • New<имя таблицы>Row() • Add<имя таблицы>Row – (<имя таблицы>Row) – (список значений полей) – класс типизированных строк <имя DataSet>.<имя таблицы>Row • Свойства <Поля> • Get<имя таблицы>Rows() Схема типизированного DataSet Типизированный DataSet Customers CustomersRow DataSet (базовый класс) DataTable “Customers” DataTable “Orders” Orders OrdersRow DataTable “OrderDetails” OrderDetails OrdersDetailsRow Типизированныt DataAdapters CustomersDataAdapter DataAdapter DataAdapter OrdersDataAdapter OrdersDetailsDataAdapter DataAdapter Создание типизированного DataSet с помощью меню • В меню Visual Studio 2008 Data Source есть пункт Data для создания и работы с типизированными DataSet. • Для создания типизированного DataSet нужно выбрать команду Add New Data Source •При создании источника данных в Visual Studio 2008 , создаются: • Класс типизированного объектов DataSet (с типизированными DataTable и DataRow). • Класс типизированных объектов DataAdapter. Пример типизированных DataSet • Доступ к данным в обычном DataSet DataSet ds = new DataSet("PersonContacts"); DataTable personTable = new DataTable("Person"); ... ds.Tables.Add(personTable); DataRow person = personTable.NewRow(); personTable.Rows.Add(person); person["Name"] = "Beer"; ... person.GetChildRows("PersonHasContacts")[0]["Name"] = "Beer"; • Доступ к данным в типизированном DataSet PersonContacts typedDS = new PersonContacts(); PersonTable personTable = typedDS.Person; Person person = personTable.NewPersonRow(); personTable.AddPersonRow(person); person.Name = "Beer"; ... person.GetContactRows()[0].Name = "Beer"; Дочерние классы • В типизированный класс DataSet включены дочерние классы – типизированных таблиц; – типизированных строк. • Для указания класса типизированной таблицы нужно указывать имя DataSet, к которому она относится <имя DS>.<имя таблицы>DataTable – Например: MyDS.CustomersDataTable; • Классы типизированных записей также включены в класс типизированного Dataset <имя DataSet>.<имя таблицы>Row – Например: MyDS.CustomersDataRow Описание типизированного класса DataSet namespace AppDataSet { public partial class NorthwndDS : global::System.Data.DataSet { private CustomersDataTable tableCustomers; private Order_DetailsDataTable tableOrder_Details; private OrdersDataTable tableOrders; private CustomersDataTable tableCustomers; private EmployeesDataTable tableEmployees; ... public partial class CustomersDataTable : DataTable, IEnumerable { ... } public partial class EmployeesDataTable : DataTable, IEnumerable {…} ... public partial class CustomersRow : DataRow {. . .} public partial class CustomersRow : DataRow {. . .} ... } } Пространство имен с описаниями классов для типизированных DataAdapter namespace <имя проекта>.<имя DS>TableAdapters namespace AppDataSet.NorthwndDSTableAdapters { ... // описание класса для TableAdapter public partial class CustomersTableAdapter : Component { ... } ... } Использование типизированного объекта TableAdapter • Подключение пространства имен • Создаем объект, куда заносить данные using <имя проекта>.<имя DS>TableAdapters; – Типизированный DataSet. Например: NorthwndDS ds = new NorthwndDS(); – Типизированную таблицу. Например: NorthwndDS.EmployeesDataTable etbl = new NorthwndDS.EmployeesDataTable(); • Создаем типизированный адаптер.Например: EmployeesTableAdapter etda = new EmployeesTableAdapter(); • Выполняем занесение данных в объект – В таблицу типизированного DataSet etda.Fill(ds.Employees); – В типизированную таблицу etda.Fill(etlb); • Подключаем объект к элементу управления – К типизированному DataSet dgv.DataSource = ds; dgv.DataMember = "Employees"; – К типизированной таблице dgv.DataSource = etbl; Пример заполнения типизированного DataSet using DSsample.NorthwindTableAdapters; // добавлено новое пространство имен ... // создаем экземпляр типизированного DataSet в классе Form NorthwndDS ds = new NorthwndDS(); private void Form1_Load(object sender, EventArgs e) { // создаем нужный типизированный адаптер EmployeesTableAdapter eta = new EmployeesTableAdapter(); // заполняем таблицу в DataSet eta.Fill(ds.Employees); // назначаем таблицу элементу управления dgv.DataSource = ds; dgv.DataMember = "Employees"; ds.Employees.get } Настройка типизированных адаптеров • Адаптер позволяет заполнить типизированные таблицы и сохранить изменения в БД. • Для адаптера можно создать несколько запросов. Например: – Запрос без параметров для загрузки всех записей – Запросы с параметрами, которые задают условия выбора записей из БД. • Для адаптеров можно создать разные методы. Например: – Fill(), которые заносят данные в типизированные таблицы. – Get(), которые возвращают созданную таблицу в качестве результата работы. Добавление запросов к адаптеру Создание типизированного адаптера и таблицы DataTable • Мастер конфигурирования TableAdapter Задание запроса вручную Построение запроса с помощью Query Builder Генерирование других команд TableAdapter • Advance options Запрос с параметром Выбор имен для методов TableAdapter Проверка метода