Sales
2037
Kathleen
Johnson
3
18000
2041
Matthew
Haglund
3
30000
2045
Steve
Marshall
3
42000
2049
Joe
Chideya
3
54000
2053
Terri
Woodruff
3
66000
2057
Randy
Nelson
3
78000
2061
Mike
Woodruff
3
90000
4
Marketing
2034
Eric
Haglund
4
12000
2038
Sorel
Polito
4
28000
2042
Cathy
Vermeren
4
0
2046
Laura
Davidson
4
60000
2050
Katie
Chideya
4
76000
2054
Cathy
Rosenthal
4
5555
2058
Kathleen
Husbands
4
108000
Создание объекта XmlReader с помощью объекта Command
В главе 4, "Модель ADO.NET: провайдеры данных", описываются способы работы с объектом Command, который является ключевым объектом — провайдером данных на платформе .NET. В ней рассматриваются способы выполнения команд на основе объектов ExecuteReader, ExecuteScalar и ExecuteNonQuery. Хотя все провайдеры данных на платформе .NET реализуют эти методы, объект SqlCommand имеет дополнительный метод ExecuteXmlReader, который используется для извлечения и доступа к XML-данным из СУБД SQL Server.
Метод ExecuteXmlReader возвращает объект XmlReader точно так же, как он возвращает объект DataReader.
Для демонстрации применения метода ExecuteXmlReader вернитесь к проекту ADO-XML и выполните следующее.
1. Включите в форму frmXML под кнопкой Write XML еще одну кнопку, перетаскивая ее из панели элементов управления.
2. В окне свойств Properties укажите значение btnExecuteXML для свойства (Name) и значение ExecuteXMLReader для свойства Text этой кнопки.
3. Затем в определении класса формы frmXML введите код из листинга 10.12.
Листинг 10.12. Код извлечения и обработки данных из СУБД SQL Server в формате XML
Private Sub btnExecuteXML_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles btnExecuteXML.Click
Dim cn As New SqlConnection _
("data source=localhost;initial catalog=pubs;user id=sa")
Dim cmd As New SqlCommand _
("select * from stores for xml auto, elements", en)
Dim reader As Xml.XmlReader
Dim str As New System.Text.StringBuilder()
cn.Open()
' Выполнение SQL-команды Select с предложением FOR XML.
reader = cmd.ExecuteXmlReader()
' Поиск и извлечение данных из узлов-элементов.
While reader.Read()
Select Case reader.NodeType
Case Xml.XmlNodeType.Element
str.Append("<" & reader.Name & ">")
Case Xml.XmlNodeType.EndElement
str.Append("</" & reader.Name & ">" & ControlChars.CrLf)
Case Xml.XmlNodeType.Text
str.Append(reader.Value)
Case Else
' В данном примере игнорируется.
End Select
End While
MsgBox(str.ToString)
сn.Close()
End Sub
Код в листинге 10.12 содержит пример упрощенного использования метода ЕхеcuteXmlReader в котором просто отображаются данные (вместе с дескрипторами) из таблицы базы данных pubs. СУБД SQL Server передается показанная ниже SQL-команда Select, в которой явно указаны возвращаемые поля в виде XML-элементов.
"select * from stores for xml auto, elements"
В таком случае обработка разных типов XML-узлов упрощается, потому что достаточно найти только начальный и конечный узлы, а текстовые узлы между ними будут содержать фактические данные. Более надежная обработка XML-документа основана на конструкции Select Case, в которой учтены узлы всех типов. После щелчка на кнопке ExecuteXMLReader будет выполнен код из листинга 10.12 и на экране появится диалоговое окно, которое показано на рис. 10.2.
РИС. 10.2. Диалоговое окно с XML-данными, извлеченными из СУБД SQL Server
В главе 9, "XML и .NET", рассматривается объект XmlDataDocument и способы его использования для доступа к иерархическим данным в виде узлов загруженного в оперативную память XML-документа. В этой книге также рассматриваются способы извлечения реляционных данных (и доступа к ним) из традиционной SQL-совеместимой базы данных. При этом необходимо выяснить следующее:
• как быть, если данные поступили из XML-источника, а нам известны только реляционные способы навигации и манипуляции записями;
• и наоборот: как быть, если данные поступили из SQL-совместимой базы данных, а нам известны только XML-совместимые способы навигации и манипуляции записями.
Читать дальше