Архитектура ADO.NET с Microsoft. Data.SqlClient

ADO.NET — это модель доступа к данным, встроенная в .NET. Microsoft. Data.SqlClient реализует эту модель для баз данных, совместимых с SQL Server, и добавляет специфические для SQL Server возможности.

Страница Microsoft.Data.SqlClient содержит сведения о возможностях драйвера и базовом уровне для рабочей среды. В этой статье объясняется, как драйвер вписывается в ADO.NET.

Абстракции ADO.NET и типы SqlClient

ADO.NET определяет независимые от провайдера абстракции в пространстве имён System.Data.Common. Microsoft. Data.SqlClient предоставляет конкретные реализации.

Абстракция ADO.NET Тип SqlClient Purpose
DbConnection SqlConnection Открывает логическое соединение с одной базой данных.
DbCommand SqlCommand Выполняет SQL-текст или сохранённую процедуру.
DbParameter SqlParameter Отправляет введённое значение отдельно от командного текста.
DbDataReader SqlDataReader Передаёт строки результата потоком с сервера.
DbTransaction SqlTransaction Объединяет команды в одну атомарную транзакцию.
DbDataAdapter SqlDataAdapter Заполняет и обновляет отключенные объекты DataSet и DataTable.
DbBatch SqlBatch Отправляет несколько команд одним пакетом для поддерживаемых целевых платформ.

Программировать против абстракций ADO.NET, когда библиотека должна поддерживать несколько поставщиков баз данных. Используйте типы SqlClient, когда приложение ориентировано на SQL Server и нуждается в специфических для провайдера функций.

Доступ к подключённым данным

Подключённый доступ сохраняет соединение доступным, пока выполняется команда и пока приложение читает её результаты.

Распространённый запрос следует следующей последовательности:

  1. Создайте SqlConnection из строки подключения.
  2. Откройте подключение.
  3. Создайте SqlCommand и добавьте значения SqlParameter.
  4. Выполните команду .
  5. Обрабатывайте скалярное значение, количество затронутых строк или SqlDataReader.
  6. Избавьтесь от считывателя, команды и соединения.

Используйте подключённый доступ для большинства веб-API, сервисов, рабочих и командных приложений. SqlDataReader передаёт строки потоком и обычно использует меньше памяти, чем при загрузке всего результата в DataSet.

Открытие и удаление SqlConnection для каждой единицы работы — это стандартный подход. Пул соединений повторно использует базовую физическую связь. Не держите одно глобальное соединение открытым на весь срок действия приложения.

Отключённый доступ к данным

SqlDataAdapterпередаёт данные между SQL Server и встроенным в память DataSet или DataTable. Приложение может закрыть соединение во время чтения или изменения данных в памяти, а затем снова подключиться для отправки обновлений.

Используйте отключённый доступ, когда это необходимо:

  • Привязка данных к DataSet или DataTable.
  • Отношения и ограничения в памяти
  • Офлайн-правки, которые согласовываются позже.
  • Совместимость с существующим приложением, построенным на основе DataAdapters.

Для новых сервисов, ориентированных на запросы, начинайте с SqlCommand и SqlDataReader если вам не нужна разъединённая объектная модель.

Специфичные для SQL Server функции

Microsoft. Data.SqlClient добавляет API и поведение соединения, которые не входят в независимый от провайдера контракт ADO.NET:

  • Аутентификация Microsoft Entra и обратные вызовы токенов доступа.
  • Строгое шифрование TDS 8.0 и опции сертификации SQL Server.
  • Всегда зашифрованные и безопасные анклавы.
  • SqlBulkCopy для высокопроизводительной загрузки данных.
  • Параметры с табличным значением.
  • Типы данных SQL Server, включая JSON и векторные типы.
  • Настраиваемая логика повторных попыток.
  • Диагностика, статистика и счетчики SQL Server.
  • Варианты доступности и резервного подключения.

Использование этих функций связывает этот код с Microsoft. Data.SqlClient. Оставляйте код, специфичный для провайдера, в пределах слоя доступа к данным, если остальная часть приложения должна оставаться независимой от провайдера.

Время жизни объектов и параллелизм

Быстро избавляйтесь от соединений, команд, считывателей, транзакций и массового копирования объектов. Используйте await using с асинхронным кодом, когда тип реализует IAsyncDisposable.

SqlConnection, SqlCommand, SqlDataReader и SqlTransaction не поддерживают одновременное использование несколькими потоками. Дайте каждой параллельной операции отдельное соединение и полагайтесь на пул соединений. Технология Multiple Active Result Sets (MARS) допускает наличие нескольких активных наборов результатов в одном соединении, но не делает объекты SqlClient потокобезопасными.

Пакеты и пространства имён

Установите пакет Microsoft.Data.SqlClient NuGet и импортируйте пространство имен Microsoft.Data.SqlClient. Драйвер поставляется отдельно от .NET, поэтому сроки выпуска новых функций, релизов и поддержки у него отличаются от сроков среды выполнения .NET.

System.Data.SqlClient Это более старый поставщик. Используйте Microsoft. Data.SqlClient для новой разработки. Для существующего приложения следуйте инструкциям из раздела Переход с System.Data.SqlClient на Microsoft.Data.SqlClient.