Джеффри Мак-Манус - Обработка баз данных на Visual Basic®.NET
РИС. 10.2. Диалоговое окно с XML-данными, извлеченными из СУБД SQL Server
Объект XmlDataDocument
В главе 9, "XML и .NET", рассматривается объект XmlDataDocument и способы его использования для доступа к иерархическим данным в виде узлов загруженного в оперативную память XML-документа. В этой книге также рассматриваются способы извлечения реляционных данных (и доступа к ним) из традиционной SQL-совеместимой базы данных. При этом необходимо выяснить следующее:
• как быть, если данные поступили из XML-источника, а нам известны только реляционные способы навигации и манипуляции записями;
• и наоборот: как быть, если данные поступили из SQL-совместимой базы данных, а нам известны только XML-совместимые способы навигации и манипуляции записями.
Ответы на эти простые вопросы основаны на применении объекта XmlDataDocument. Он является производным от класса XmlDocument, но обладает расширенными возможностями. Помимо внутренней копии данных, он содержит XML-совместимые средства доступа к ним как к классу XmlDocument с помощью XML-узлов, а также реляционные средства доступа на основе объекта DataSet. Объект XmlDataDocument автоматически синхронизирует оба эти представления (или, иначе говоря, способа доступа) таким образом, чтобы любые изменения, выраженные в одной технологии, сразу же отображались средствами другой технологии. Такой подход позволяет легко смешивать и находить соответствие между разными источниками данных на основе разных технологий.
Для демонстрации этих средств вернитесь к проекту ADO-XML и выполните перечисленные ниже действия.
1. Вставьте еще две кнопки в форму frmXML сразу под кнопкой ExecuteXMLReader, перетаскивая их из панели элементов управления.
2. В окне свойств Properties укажите значение btnNavigateSQL для свойства (Name) и значение Navigate SQL для свойства Text первой кнопки.
3. В окне свойств Properties укажите значение btnAddRows для свойства (Name) и значение Add Rows to XML для свойства Text второй кнопки.
4. Для импорта пространства имен XPath включите строку кода Imports System.Xml.XPath в конце списка команд импорта в верхней части файла с кодом.
5. В код класса frmXML включите две подпрограммы.
Private Sub btnNavigateSQL_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles btnNavigateSQL.Click
Dim en As New SqlConnection _
("data source=localhost;initial catalog=pubs;user id=sa")
Dim da As New SqlDataAdapter("Select * from authors", cn)
Dim ds As New DataSet()
' Вставка в объект DataSet данных из реляционной базы данных
da.Fill(ds, "authors")
' Создание объекта XmlDataDocument на основе существующего
' объекта DataSet.
Dim xmlDoc As New Xml.XmlDataDocument(ds)
' Получение объекта-навигатора из XmlDataDocument.
Dim xmlNav As XPathNavigator = xmlDoc.CreateNavigator()
' Извлечение всех фамилий авторов из штата Калифорния (СА).
Dim xIterator As XPathNodeIterator xIterator = _
xmlNav.Select("//authors[state='CA']/au_lname")
' Последовательный обход всех выбранных узлов и
' отображение фамилий всех авторов.
Dim str As New System.Text.StringBuilder()
While (xIterator.MoveNext())
str.Append(xIterator.Current.Value & ControlChars.CrLf)
End While
MsgBox(str.ToString)
End Sub
Private Sub btnAddRows_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles btnAddRows.Click
Dim dsPubs As New DataSet()
' Считывание XML-данных из файла.
dsPubs.ReadXml("..Pubs.xml")
' Вставка новой записи.
Dim row As DataRow = dsPubs.Tables("Publishers").NewRow()
row("pub_name") = "Newbie Publishing Corp."
row("city") = "New York"
row("state") = "NY"
row("Country") = "USA"
dsPubs.Tables("Publishers").Rows.Add(row)
' Связывание объекта DataSet с сеткой Data Grid
' для просмотра новых данных.
grdData.DataMember = "publishers"
grdData.DataSource = dsPubs
End Sub
Подпрограмма btnNavigateSQL_Click считывает данные из базы данных SQL Server, а затем выполняет обход всех записей, извлеченных с помощью XPATH-запроса. В этой подпрограмме ключевыми являются приведенные ниже строки.
Dim xmlDoc As New Xml.XmlDataDocument(ds)
' Получение объекта-навигатора из XmlDataDocument.
Dim xmlNav As XPathNavigator = xmlDoc.CreateNavigator()
' Извлечение всех фамилий авторов из штата Калифорния (CA).
Dim xIterator As XPathNodeIterator xIterator = _
xmlNav.Select("//authors[state='CA']/au_lname")
Сначала объект DataSet с данными связывается с новым объектом XmlDataDocument. Затем создается объект-навигатор XPathNavigator на основе объекта-документа XmlDataDocument. После чего на основе объекта XPathNavigator создается объект-итератор XPathNodeIterator. Далее строка XPATH-запроса передается методу Select для возвращения списка фамилий авторов (т.е. значений поля из Калифорнии (т.е. у которых поле state имеет значение СА). После этого выполняется последовательный обход всех узлов, извлеченных данным запросом, и создается строка с искомым перечнем авторов. Эта строка отображается в диалоговом окне, которое показано на рис. 10.3.
РИС. 10.3. Диалоговое окно с XML-данными, извлеченными из объекта DataSet
Вторая подпрограмма, btnAddRows_Clicks, выполняет другую задачу. Сначала она считывает XML-данные с помощью метода ReadXml из файла Pubs. в набор данных dsPubs, как показано в листинге 10.1. Этот метод автоматически создает таблицу publishers в объекте DataSet. Далее новые данные вставляются с помощью реляционных методов и объектов, например объекта-записи DataRow. Новый объект DataRow включается в схему таблицы publishers, а полям присваиваются указанные значения. После этого новая запись вставляется в таблицу publishers, а результат вставки отображается в сетке DataGrid (рис. 10.4).
РИС. 10.4. Вид сетки DataGrid после считывания данных из XML-файла вставки строки
Резюме
В этой главе демонстрируется тесная взаимосвязь и интеграция способов доступа к данным и XML на платформе .NET Framework. В частности, показано, что объект DataSet обладает возможностями чтения и записи XML-данных и XML-схем. При отсутствии определения XML-схемы объект DataSet способен вывести его на основании анализа структуры данных в считанном XML-документе.
С другой стороны, объект XmlDataDocument образует мост между реляционным и иерархическим миром XML. Доступ к данным внутри объекта XmlDataDocument можно получить либо XML-совместимым способом, либо реляционным. Изменения в одном представлении автоматически реплицируются в другом представлении. Разработчик базы данных может выбрать наиболее удобный способ доступа к данным и манипулирования ими.
Методам и инструментам реляционного и иерархического доступа к данным посвящено множество специализированных книг и учебных пособий. Невозможно в рамках одной главы или даже целой книги полностью описать их. Здесь следует лишь запомнить, что ADO.NET и XML-объекты на платформе .NET предназначены для наиболее тесной интеграции и взаимодействия друг с другом.
Вопросы и ответы
Иногда в документации по платформе.NET, помимо XSD-формата схемы данных, упоминается XDR-формат. Что это такое?
XSD-формат — это стандартный формат определения схемы XML-данных, принятый консорциумом World Wide Web Consortium (W3C), который специализируется на создании Web-ориентированных стандартов (более подробную информацию об этом консорциуме можно найти по адресу: www.w3c.org). Еще до окончания работ по созданию стандарта для XSD-формата компания Microsoft решила создать собственный временный формат XML-Data Reduced (XDR) для определений XML-схем. После завершения работы над стандартом XSD-формата в мае 2001 года Microsoft перешла к полной поддержке XSD-формата. Несмотря на то что на платформе .NET Framework схемы данных сохраняются только в XSD-формате, они могут считываться в обоих форматах для совместимости с прежними унаследованными системами. В наборе инструментальных средств разработчика .NET Framework SDK предусмотрена специальная утилита xsd.exe, которая может (помимо прочего) конвертировать схему данных из формата XDR в формат XSD.
Как конкретно ADO.NET автоматически определяет схему данных после анализа XML-документа?
Алгоритм автоматического определения схемы данных хорошо документирован в справочных материалах Visual Studio .NET. Для ознакомления с ним следует обратиться к разделу Inferring DataSet Relational Structure from XML (Автоматическое определение XML-схемы данных после анализа реляционной структуры объекта DataSet). В нем приводится краткое описание алгоритма, некоторые особенности анализа таблиц, полей и отношений, а также ограничения алгоритма.
В этой главе описаны два способа доступа к данным: реляционный на основе объекта DataSet и иерархический на основе XmlDataDocument. В каких ситуациях следует их применять?
Вообще говоря, не существует единственно верного и универсального способа. Каждый из них следует применять в зависимости от используемых источников данных и поставленной задачи. Платформа .NET Framework позволяет гибко использовать данные из любых источников: реляционных или иерархических. Независимо от источника, данные можно сохранять как реляционные или как иерархические в соответствии с конкретными потребностями. Кроме того, если источник данных и полученные после обработки данные должны иметь формат XML, а вы в недостаточной степени владеете технологиями и инструментами XML, то поставленную задачу все равно можно успешно выполнить с помощью реляционных инструментов на основе объектов DataSet и DataTable.
Откройте для себя мир чтения на siteknig.com - месте, где каждая книга оживает прямо в браузере. Здесь вас уже ждёт произведение Джеффри Мак-Манус - Обработка баз данных на Visual Basic®.NET, относящееся к жанру Программирование. Никаких регистраций, никаких преград - только вы и история, доступная в полном формате. Наш литературный портал создан для тех, кто любит комфорт: хотите читать с телефона - пожалуйста; предпочитаете ноутбук - идеально! Все книги открываются моментально и представлены полностью, без сокращений и скрытых страниц. Каталог жанров поможет вам быстро найти что-то по настроению: увлекательный роман, динамичное фэнтези, глубокую классику или лёгкое чтение перед сном. Мы ежедневно расширяем библиотеку, добавляя новые произведения, чтобы вам всегда было что открыть "на потом". Сегодня на siteknig.com доступно более 200000 книг - и каждая готова стать вашей новой любимой. Просто выбирайте, открывайте и наслаждайтесь чтением там, где вам удобно.


