Язык программирования C#9 и платформа .NET5 - Эндрю Троелсен
Шрифт:
Интервал:
Закладка:
Сравнение ADO.NET и ADO
Если у вас есть опыт работы с предшествующей моделью доступа к данным на основе СОМ от Microsoft (Active Data Objects — ADO) и вы только начинаете использовать платформу .NET Core, то имейте в виду, что инфраструктура ADO. NET имеет мало общего с ADO помимо наличия в своем названии букв "A", "D" и "О". В то время как определенная взаимосвязь между двумя системами действительно существует (скажем, в обеих присутствует концепция объектов подключений и объектов команд), некоторые знакомые по ADO типы (например, Recordset) больше не доступны. Вдобавок вы обнаружите много новых типов, которые не имеют прямых эквивалентов в классической технологии ADO (скажем, адаптер данных).
Поставщики данных ADO.NET
В ADO.NET нет единого набора типов, которые взаимодействовали бы с множеством СУБД. Взамен ADO.NET поддерживает многочисленные поставщики данных, каждый из которых оптимизирован для взаимодействия со специфичной СУБД. Первое преимущество такого подхода в том, что вы можете запрограммировать специализированный поставщик данных для доступа к любым уникальным средствам отдельной СУБД. Второе преимущество связано с тем, что поставщик данных может подключаться непосредственно к механизму интересующей СУБД без какого-либо промежуточного уровня отображения.
Выражаясь просто, поставщик данных — это набор типов, определенных в отдельном пространстве имен, которым известно, как взаимодействовать с конкретным источником данных. Безотносительно к тому, какой поставщик данных применяется, каждый из них определяет набор классов, предоставляющих основную функциональность. В табл. 21.1 описаны распространенные основные базовые классы и ключевые интерфейсы, которые они реализуют.
Хотя конкретные имена основных классов будут отличаться между поставщиками данных (например, SqlConnection в сравнении с OdbcConnection), все они являются производными от того же самого базового класса (DbConnection в случае объектов подключения), реализующего идентичные интерфейсы (вроде IDbConnection). С учетом сказанного вполне корректно предположить, что после освоения работы с одним поставщиком данных остальные поставщики покажутся довольно простыми.
На заметку! Когда речь идет об объекте подключения в ADO.NET, то на самом деле имеется в виду специфичный тип, производный от DbConnection; не существует класса с буквальным именем "Connection". Та же идея остается справедливой в отношении объекта команды, объекта адаптера данных и т.д. По соглашению об именовании объекты в конкретном поставщике данных снабжаются префиксом в форме названия связанной СУБД (например, SqlConnection, SqlCommand и SqlDataReader).
На рис. 21.1 иллюстрируется место поставщиков данных в инфраструктуре ADO.NET. Клиентская сборка может быть приложением .NET Core любого типа: консольной программой, приложением Windows Forms, приложением WPF, веб-страницей ASP.NET Core, библиотекой кода .NET Core и т.д.
Кроме типов, показанных на рис. 21.1, поставщики данных будут предоставлять и другие типы; однако эти основные объекты определяют общие характеристики для всех поставщиков данных.
Поставщики данных ADO.NET
Подобно всем компонентам .NET Core поставщики данных поступают в виде пакетов NuGet. В их число входят поставщики, поддерживаемые Microsoft, но доступно и множество сторонних поставщиков. В табл. 21.2 описаны некоторые поставщики данных, поддерживаемые Microsoft.
Поставщик данных Microsoft SQL Server предлагает прямой доступ к хранилищам данных Microsoft SQL Server — и только к ним (включая SQL Azure). Пространство имен Microsoft.Data.SqlClient содержит типы, используемые поставщиком SQL Server.
На заметку! Хотя System.Data.SqlClient по-прежнему поддерживается, все усилия по разработке средств для взаимодействия с SQL Server (и с SQL Azure) сосредоточены на новой библиотеке поставщика Microsoft.Data.SqlClient.
Поставщик ODBC (System.Data.Odbc) обеспечивает доступ к подключениям ODBC. Типы ODBC, определенные в пространстве имен System.Data.Odbc, обычно полезны, только если требуется взаимодействие с СУБД, для которой отсутствует специальный поставщик данных .NET Core. Причина в том, что ODBC является широко распространенной моделью, которая предоставляет доступ к нескольким хранилищам данных.
Поставщик данных OLE DB, который состоит из типов, определенных в пространстве имен System.Data.OleDb, позволяет получать доступ к данным в любом хранилище данных, поддерживающем классический протокол OLE DB на основе СОМ. Из-за зависимости от СОМ этот поставщик будет работать только в среде Windows и считается устаревшим в межплатформенном мире .NET Core.
Типы из пространства имен System.Data
Из всех пространств имен, относящихся к ADO.NET, System.Data является "наименьшим общим знаменателем". Оно содержит типы, которые совместно используются всеми поставщиками данных ADO. NET независимо от лежащего в основе хранилища данных. В дополнение к нескольким исключениям, связанным с базами данных (например, NoNullAllowedException, RowNotlnTableException и MissingPrimaryKeyException), пространство имен System.Data содержит типы, которые представляют разнообразные примитивы баз данных (вроде таблиц, строк, столбцов и ограничений), а также общие интерфейсы, реализуемые классами поставщиков данных. В табл. 21.3 описаны основные типы, о которых следует знать.
Следующей задачей будет исследование основных интерфейсов System.Data на высоком уровне, что поможет лучше понять общую функциональность, предлагаемую любым поставщиком данных. В ходе чтения настоящей главы вы также ознакомитесь с конкретными деталями, а пока лучше сосредоточить внимание на общем поведении каждого типа интерфейса.
Роль интерфейса IDbConnection
Интерфейс IDbConnection реализован объектом подключения поставщика данных. В нем определен набор членов, применяемых для конфигурирования подключения к специфичному хранилищу данных. Он также позволяет получить объект транзакции поставщика данных. Вот формальное определение IDbConnection:
public interface IDbConnection : IDisposable
{
string ConnectionString { get; set; }
int ConnectionTimeout { get; }
string Database { get; }
ConnectionState State { get; }
IDbTransaction BeginTransaction();
IDbTransaction BeginTransaction(IsolationLevel il);
void ChangeDatabase(string databaseName);
void Close();
IDbCommand CreateCommand();
void Open();
void Dispose();
}
Роль интерфейса IDbTransaction
Перегруженный метод BeginTransaction(), определенный в интерфейсе IDbConnection, предоставляет доступ к объекту транзакции поставщика. Члены, определенные интерфейсом IDbTransaction, позволяют программно взаимодействовать с транзакционным сеансом и лежащим в основе хранилищем данных:
public interface IDbTransaction : IDisposable
{
IDbConnection Connection { get; }
IsolationLevel IsolationLevel { get; }