Понятие 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();
conn.Close();
Данный пример инициализирует строку соединения с базой данных и открывает соединение. Затем создает команду в виде SQL-запроса на чтение всех записей из таблицы Customers(заказчики). С помощью ExecuteReaderкоманда выполняется, и для работы с данными строится объект SqlDataReader. После этого формируется цикл, который проходит по всем записям, ищет первую запись с именем Сергей Петров и прерывает цикл, сохраняя данные о телефоне в локальной переменной.
Для сравнения перепишем этот простой пример, используя LINQ для Dataset:
SqlConnection conn = new SqlConnection(@"
Data Source=localhost;
Initial Catalog=BookMVC;
Integrated Security=True");
conn.Open();
SqlCommand cmd = new SqlCommand("SELECT * FROM Customers", conn);
DataSet ds = new DataSet();
SqlDataAdapter adapter = new SqlDataAdapter(cmd);
adapter.Fill(ds);
DataTable customers = ds.Tables[0];
string phone = customers. AsEnumerable()
.Where(x => x.Field("name") == "Сергей Петров")
.Select(x => x.Field("phone")).SingleOrDefault();
conn.Close();
Как нетрудно заметить, наш цикл, нацеленный на поиск данных, исчез, и ему на замену пришло LINQ-выражение, которое выполняет точно ту же логику — ищет телефон по определенному номеру.
Механизм доступа к данным через ADO.NET Dataset в общем случае производительнее, чем через ORM, вроде LINQ для SQL или Entity Framework, поскольку при работе с объектами типа Datasetнет затрат на реализацию объектной модели базы данных. Работа с данными происходит напрямую через SQL-запросы или вызов хранимых процедур. Разработчик сам контролирует весь процесс получения и использования данных, что дает больше возможностей и прирост производительности, но с другой стороны, увеличивает объем написания необходимого кода.
Читать дальше
Конец ознакомительного отрывка
Купить книгу