<Zip>100888</Zip>
<Country>Россия</Country>
</Address>
</Order>
<Order OrderId="100" OrderDateTime="01.02.2009">
<Address>
<Name>Сергей Петров</Name>
<Street>ул. Бажова</Street>
<House>76</House>
<Apartment>123</Apartment>
<City>Eкатеринбург</City>
<Zip>620000</Zip>
<Country>Россия</Country>
</Address>
</Order>
</Orders>
Для получения имени по номеру ордера, используя LINQ для XML, мы можем написать следующий код:
XDocument xdoc =
XDocument.Load("D:\\CPS\\#Projects\\MVCBook\\MVCBook\\Order.xml");
IEnumerable<XElement> orders =
xdoc.Element("Orders").Descendants("Order");
int orderId = 100;
IEnumerable<XElement> order =
orders.Where(x => x.Attribute("OrderId").Value == orderId.ToString());
XElement address = order.Select(x => x.Element("Address"))
.FirstOrDefault();
string name = address.Element("Name").Value;
В данном примере загружается файл orders.xml, в переменной orders присваиваются все заявки (элементы Order в XML-файле). Затем с помощью LINQ-запроса находится заявка с идентификатором 100. После этого выбирает элемент адреса заявки и, в завершение, из адреса извлекается имя.
Стоит отметить, что в данном примере не производились проверки возвращаемых значений на null, что на практике делать обязательно.
Работа с данными через ADO.NET
Понятие ADO.NET на платформе .NET достаточно широкое. На самом деле LINQ для SQL и LINQ для XML, а также все остальные стандартные LINQ-реализации входят в механизм ADO.NET как составные части. Но исторически ADO.NET развивалось от версии к версии платформы через другие механизмы, такие как объекты Dataset
.
Dataset
— это объект, содержащий кэш данных, загруженных из источника данных. По сути Dataset
— это набор объектов типа DataTable
, представляющих собой таблицы данных, и DataRelation
, которые описывают связи между объектами DataTable
.
Практически весь функционал по работе с данными через Dataset
расположен в .NET Framework в пространствах имен System.Data и System.Data.OleDb (кроме этого, существует еще более двух десятков пространств имен, название которых начинается с System.Data). Перечислим основные самые важные классы, которые используются чаще всего при работе с Dataset
из System.Data:
□ DataSet, DataTable, DataColumn, DataRow
— различные варианты представления данных (набор, таблица, схема колонки, строка данных);
□ ConstraintCollection, Constraint, UniqueConstraint
— представляют ограничения, которые могут быть наложены на объекты DataColumn.ConstraintCollection
содержит набор таких ограничений для объекта DataTable
;
□ DataView
— объект, позволяющий привязывать данные из DataTable
к формам WinForms или WebForms;
Список наиболее часто используемых классов пространства имен System.Data.OleDb:
□ OleDbConnection
— обеспечивает подключение к базе данных через механизм OLE DB;
□ oleDbCommand
— содержит запрос к базе данных на языке SQL либо представляет хранимую процедуру;
□ oleDataAdapter
— обеспечивает заполнение объекта DataSet
нужными данными с помощью элементов OieDbCommand;
□ oleDbDataReader — позволяет читать данные, полученные от oieDataAdapter, в виде строк и в прямом порядке;
□ oleDbTransaction
— представляет собой транзакцию в источнике данных.
Существует еще одно часто используемое пространство имен, которое может быть полезно при разработке баз данных на SQL Server — System.Data.SqlClient. Это пространство имен содержит весь функционал System.Data.OleDb, только в реализации для использования исключительно с SQL Server. Применение этого пространства имен позволяет получить доступ к особенностям SQL Server, таким как новые типы данных SQL Server 2008.
Рассмотрим пример доступа к данным посредством базовых механизмов ADO.NET DataSet:
SqlConnection conn = new
SqlConnection("Data Source=localhost,
Initial Catalog=BookMVC, Integrated Security=True");
conn.Open();
SqlCommand cmd = new SqlCommand("SELECT * FROM Customers", conn);
SqlDataReader reader = cmd.ExecuteReader();
string phone;
while (reader.Read())
{
string name = reader["name"].ToString();
if (name == "Сергей Петров")
{
phone = reader["phone"].ToString();
break;
}
}
reader.Close();