Книга: Обработка баз данных на Visual Basic®.NET

Строго типизированные наборы данных

Строго типизированные наборы данных

До сих пор обсуждались варианты использования нетипизированного объекта DataSet. Однако в модели ADO.NET и среде Visual Studio. NET предусмотрены способы создания типизированных объектов DataSet. Типизированный объект DataSet является производным от нетипизированного класса DataSet, но содержит объекты, методы, свойства и события, специфические для используемой схемы данных. Она определяется в файле схемы с расширением .xsd, а в среде Visual Studio .NET предусмотрены графические инструменты для генерации набора классов на основе этой схемы.

Поскольку типизированный объект DataSet является производным от нетипизированного класса DataSet, он наследует все функции, свойства, методы и события, а значит, может использоваться в тех же ситуациях, где применяется нетипизированный класс DataSet. Однако его элементы являются строго типизированными и предлагают дополнительные функции, что способствует повышению производительности и надежности.

• Типизированные объекты DataSet, DataTable и DataRow являются специализированными для используемой схемы.

• Типизированные объекты DataColumn и DataRelation предлагаются как специализированные именованные свойства, а не универсальные элементы коллекций.

• Для типизированных объектов можно выполнять проверку типов во время компиляции.

• В редакторе кода в среде Visual Studio .NET предусмотрено использование средства IntelliSense.

• Код имеет более краткую и читабельную форму.

Например, команда указания нового значения для поля таблицы будет иметь следующий вид:

dsCustomers.tables("Customers").Rows(row)("FirstName") = NewValue

Здесь row — это индекс в коллекции записей Rows таблицы Customers, FirstName — поле таблицы Customers, a NewValue — новое присваиваемое значение. При таком кодировании нетипизированного набора данных могут возникать разные ошибки. Соответствует ли тип нового значения NewValue типу поля, которому оно присваивается? Существует ли таблица Customers? Существует ли поле FirstName? Правильно ли указано имя поля или таблицы? При этом получить сообщение об ошибке можно будет только во время выполнения приложения.

Однако при использовании типизированного набора данных все свойства имеют специализированные значения для заданной схемы, а потому проверка типов выполняется еще во время создания приложения. Соответствующий код для типизированного набора данных DataSet с таблицей Customers будет иметь вид

dsCustomers.Customers(row).FirstName = NewValue

Обратите внимание, что объект-таблица Customers теперь является специализированным свойством типизированного набора данных DataSet, а поле FirstName — специализированным свойством типизированного объекта Customers. Продемонстрируем кратко, как в редакторе кода среды Visual Studio .NET используется средство IntelliSense.

Вернемся к таблице Departments для демонстрации этого способа работы на примере проекта DataSetCode из главы 5, "ADO.NET: объект DataSet".

1. Откройте проект DataSetCode в среде Visual Studio .NET.

2. В форме под кнопкой Data Views создайте кнопку, перетаскивая ее из панели элементов управления.

3. В окне Properties укажите значение btnTypedDataSet для свойства (Name) и значение Typed DataSet для свойства Text этой кнопки.

Теперь нужно включить в проект используемую схему: либо обратиться к уже готовому файлу с расширением .xsd, либо создать новый с помощью компонентов вкладки Data панели элементов управления.

1. Вставьте в форму новый компонент SqlDataAdapter. В диалоговом окне программы-мастера Data Adapter Configuration Wizard выберите подключение к базе данных Novelty. Затем в диалоговом окне Choose a Query Type выберите переключатель Use SQL statements. В диалоговом окне Generate the SQL statements укажите команду SELECT * FROM tblDepartment для загрузки данных в объект — набор данных. По окончании работы с программой-мастером Data Adapter Configuration Wizard укажите значение daDepartments для свойства (Name) для созданного объекта — адаптера данных.

2. Откройте диалоговое окно Generate DataSet (Создать набор данных), выбрав команду меню Data?Generate DataSet или щелкнув правой кнопкой мыши на форме и выбрав в контекстном меню команду Generate DataSet. В группе переключателей Choose a dataset (Выбрать набор данных) выберите переключатель New (Создать), введите в текстовом поле имя DepartmentDS, установите флажок Add this dataset to the designer (Включить этот набор данных в приложение) и щелкните на кнопке OK.

3. Укажите значение dsDepartments для свойства (Name) для созданного объекта — набора данных.

После выполнения этих действий генератор набора данных включит в проект файл схемы DepartmentDS.xsd и файл DepartmentDS.vb, который реализует специализированные классы набора данных DataSet. Файлы отображаются только после щелчка на кнопке Show all files (Показать все файлы) в верхней части окна Solution Explorer.

4. Щелкните дважды на файле DepartmentDS.xsd в окне Solution Explorer для отображения диалогового окна редактирования схемы XML.

5. Попробуйте внести небольшие изменения в имена элементов схемы. Вместо имени tblDepartment укажите в самом верхнем левом текстовом поле имя Departments, как показано на рис. 7.7.


РИС. 7.7. Схема DepartmentsDS в окне редактирования схемы

6. Щелкните правой кнопкой мыши на окне редактирования схемы и убедитесь в том, что в контекстном меню установлен флажок параметра Generate Dataset. Он устанавливается по умолчанию, но если он все же не установлен по какой-то причине, то установите его снова.

7. Сохраните схему и закройте окно редактирования схемы. В результате этих действий будет автоматически сгенерирован файл DepartmentsDS.vb.

НА ЗАМЕТКУ

Для просмотра содержимого файла DepartmentsDS.vb откройте его в окне редактирования кода. Учтите, что для указанного имени таблицы Departments генератор кода в дополнение к уже имеющемуся типизированному объекту создаст следующие объекты:

DepartmentsDataTable
DepartmentsDataRow
DepartmentsRowChangeEvent
 

Теперь следует создать код для использования типизированного объекта DepartmentsDS, который показан в листинге 7.8.

Листинг 7.8. Код отображения содержимого типизированного объекта DepartmentsDS

Private Sub btnTypedDataSet_Click(ByVal sender As System.Object, _
 ByVal e As System.EventArgs) Handles btnTypedDataSet.Click
 daDepartments.Fill(dsDepartments, "Departments")
 DisplayDepartments(dsDepartments)
End Sub
Private Sub DisplayDepartments(ByVal ds As DepartmentsDS)
 Me.lstOutput.Items.Clear()
 Me.lstOutput.Items.Add("DISPLAY TYPED DATASET")
 Me.lstOutput.Items.Add("=====================")
 ' Каждое поле теперь является свойством объекта DepartmentsDS.
 Dim row As DepartmentsDS.DepartmentsRow
 For Each row In ds.Departments.Rows
  Me.lstOutput.Items.Add( _
   ds.Departments.IDColumn.ColumnName _
   & ": " & row.ID.ToString)
  Me.lstOutput.Items.Add( _
   ds.Departments.DepartmentNameColumn.ColumnName _
   & ": " & row.DepartmentName)
 Next
End Sub

В подпрограмме btnTypedDataSet_Click сначала используется метод Fill объекта daDepartments для вставки данных в таблицу Department. Затем вызывается подпрограмма DisplayDepartments для отображения содержимого таблицы с помощью циклического обхода всех записей таблицы с указанием имени поля и значения в нем. Этот подход несколько отличается от описанных ранее.

• Переменная row создается с указанием типа записи DepartmentDS.DepertmentsRow, а не как универсальный объект DataRow.

• Таблица Departments доступна как свойство объекта ds.Departments, а не как элемент коллекции таблиц Tables, т.е. ds.Tables("Departments").

• Поля таблицы доступны как свойства объекта-таблицы, например ds.Column и ds.Departments.DepartmentNameColumn, а не как элементы коллекции полей Columns, т.е. ds.Tables("Departments").Columns("ID") и ds.Tables("Departments").Columns("DepartmentName").

• Значения полей доступны как свойства объекта-записи, например row.ID и row. DepartmentName, а не как элементы коллекции значений Items объекта-записи Rows, т.е. row("ID") и row("DepartmentName").

На рис. 7.8 показано, как типизированные свойства (например, DepartmentName) представлены в контекстном меню средства IntelliSense, которое ускоряет процесс создания кода.


РИС. 7.8. Контекстное меню средства IntelliSense со свойствами типизированного объекта DataSet

Оглавление книги


Генерация: 1.473. Запросов К БД/Cache: 3 / 1
поделиться
Вверх Вниз