Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Microsoft.Data.SqlClient — это поддерживаемый поставщик данных .NET для SQL Server, База данных SQL Azure, Управляемый экземпляр SQL Azure, Azure Synapse Analytics, базы данных SQL в Microsoft Fabric и Хранилища в Microsoft Fabric. Он распространяется в виде пакета NuGet, развивается независимо от среды выполнения .NET и заменяет System.Data.SqlClient в новой разработке. Предоставляет соединения, команды, обработку результатов, транзакции, массовое копирование и специфичные для SQL Server функции для .NET-приложений.
Выберите начальную точку
- Чтобы настроить проект и запустить первый запрос, начните с «Начать с драйвера SqlClient».
- Чтобы создать базу данных для подключения, смотрите предварительные условия в разделе «Начало работы с драйвером SqlClient».
- Чтобы добавить или обновить драйвер в .NET-проекте, перейдите в раздел Установка, обновление и развертывание Microsoft. Data.SqlClient.
- Чтобы подключиться к Azure SQL с помощью аутентификации без пароля, ознакомьтесь с аутентификацией Microsoft Entra и строками подключения.
- Чтобы сделать существующее приложение устойчивым к временным сбоям, перейдите в разделы Configurable retry logic и High Availability and disaster recovery.
- Чтобы эффективно перемещать большие наборы данных, перейдите к операциям массового копирования.
- Чтобы перейти с
System.Data.SqlClient, начните со статьи Переход с System.Data.SqlClient на Microsoft.Data.SqlClient. - Чтобы диагностировать проблему соединения или запроса, перейдите к руководству по устранению неполадок SqlClient и включите отслеживание источников событий.
Производственные базовые показатели для Azure SQL
Используйте этот фрагмент как отправную точку для ориентированного на продакшн пути доступа к данным Azure SQL. Он считывает имена сервера и базы данных из IConfiguration, поэтому значения поступают от поставщиков конфигурации, которые хост подключает, таких как appsettings.jsonпеременные среды, Конфигурация приложений Azure и настройки, хранящиеся в Key Vault. Конфигурация сочетает следующие особенности:
- Защита транспортного уровня (TLS).
- Управляемая идентификация.
- Устойчивость к разрывам неактивных соединений.
- Повторная попытка начального подключения через настраиваемую логику повторных попыток (CRL) со структурированным логированием.
- Повторная попытка на уровне команды для временных ошибок, возникающих во время запроса.
- Быстрое восстановление группы отработки отказа.
- Асинхронные вызовы, принимающие токен отмены.
Для повышения безопасности и поддержки конфигурации между окружениями храните информацию о соединении вне вашего кода. В продакшене храните информацию о соединениях в системе конфигурации приложения и используйте Azure Key Vault для чувствительных значений. Дополнительные сведения см. в разделе Защита сведений о подключении.
Фрагмент кода C# в этой статье не содержит директив using и обёрток классов для краткости.
Фрагмент предполагает проект, ориентированный на .NET 8 или более поздние версии, и ссылается на пакеты Microsoft.Data.SqlClient и Microsoft.Data.SqlClient.Extensions.Azure версии 7.1.1. Хост, такой как .NET Generic Host или ASP.NET Core, предоставляет ILogger и IConfiguration, а конфигурация — имя сервера в Sql:Server и имя базы данных в Sql:Database.
public static async Task<string> QueryDatabaseNameAsync(
IConfiguration config, ILogger logger, CancellationToken cancellationToken = default)
{
string server = config["Sql:Server"]
?? throw new InvalidOperationException("Missing configuration value 'Sql:Server'.");
string database = config["Sql:Database"]
?? throw new InvalidOperationException("Missing configuration value 'Sql:Database'.");
var builder = new SqlConnectionStringBuilder
{
DataSource = server,
InitialCatalog = database,
Authentication = SqlAuthenticationMethod.ActiveDirectoryManagedIdentity,
Encrypt = SqlConnectionEncryptOption.Strict, // TDS 8.0 encryption (server must support it)
ConnectTimeout = 30, // per-attempt connect timeout in seconds
// Retry transient failures during Open() and reconnect a dropped idle connection.
// The configurable provider below adds another policy around Open().
ConnectRetryCount = 3,
ConnectRetryInterval = 10,
MultiSubnetFailover = true, // recommended for TCP endpoints; enables parallel connect
// ApplicationIntent = ApplicationIntent.ReadOnly, // uncomment to route to a readable secondary
};
// Add exponential backoff and jitter around Open().
// TransientErrors is null, so the provider uses the driver's built-in transient error list.
var openRetry = SqlConfigurableRetryFactory.CreateExponentialRetryProvider(
new SqlRetryLogicOption
{
NumberOfTries = 5,
DeltaTime = TimeSpan.FromSeconds(3),
MaxTimeInterval = TimeSpan.FromSeconds(60),
});
openRetry.Retrying += (_, args) =>
{
Exception last = args.Exceptions[^1];
logger.LogWarning(
last,
"Retrying SQL connection to {Server}/{Database} (attempt {Attempt}) after {Delay}",
server, database, args.RetryCount, args.Delay);
};
// Retry commands that hit deadlocks, lock timeouts, or common Azure SQL transient errors
// mid-query on an established connection. Only attach this provider to commands whose
// effect is safe to repeat.
var commandRetry = SqlConfigurableRetryFactory.CreateExponentialRetryProvider(
new SqlRetryLogicOption
{
NumberOfTries = 4,
DeltaTime = TimeSpan.FromSeconds(5),
MaxTimeInterval = TimeSpan.FromSeconds(30),
// Deadlock victim, lock-request timeout, and common Azure SQL transient errors.
TransientErrors = new[] { 1205, 1222, 10928, 10929, 40197, 40501, 40613, 49918 },
});
commandRetry.Retrying += (_, args) =>
{
Exception last = args.Exceptions[^1];
logger.LogWarning(
last,
"Retrying SQL command (attempt {Attempt}) after {Delay}",
args.RetryCount, args.Delay);
};
await using var connection = new SqlConnection(builder.ConnectionString)
{
RetryLogicProvider = openRetry,
};
await connection.OpenAsync(cancellationToken);
await using var command = new SqlCommand("SELECT DB_NAME()", connection)
{
RetryLogicProvider = commandRetry,
CommandTimeout = 30,
};
var name = (string)await command.ExecuteScalarAsync(cancellationToken);
logger.LogInformation("Connected to database {DatabaseName}", name);
return name;
}
Метод возвращает имя базы данных, к которой он подключён, и записывает Connected to database <database>в журнал. Когда происходит повторная попытка, также регистрируется одно предупреждение для каждой такой попытки с указанием исключения, которое её вызвало.
Как работает каждая часть фрагмента:
- Целевые объекты: любая конечная точка подключения SQL ядро СУБД, настроенная для аутентификации Microsoft Entra: База данных SQL Azure, Управляемый экземпляр SQL Azure, база данных SQL в Microsoft Fabric и SQL Server 2022 и более поздних версий на виртуальных машинах Azure или с поддержкой Azure Arc.
-
Encrypt = SqlConnectionEncryptOption.Strict: Выбор шифрования TDS 8.0. Для этого требуется SQL Server 2022 и более поздние версии, База данных SQL Azure, Управляемый экземпляр SQL Azure или SQL база данных в Microsoft Fabric. ИспользуйтеSqlConnectionEncryptOption.Mandatoryдля старых серверов. -
ActiveDirectoryManagedIdentity: Работает только там, где доступна управляемая идентичность, например Служба приложений Azure, Функции Azure или виртуальная машина Azure. Для локальной разработки используйтеSqlAuthenticationMethod.ActiveDirectoryDefault, который пытается выполнить аутентификацию через Azure CLI, вход в Visual Studio и другие источники учетных данных. Не используйте это в продакшене, потому что проверка каждого источника замедляет подключение. Для получения дополнительной информации см. раздел «Использовать аутентификацию по умолчанию». -
MultiSubnetFailover = true: Пытается параллельно установить TCP-соединения ко всем IP-адресам, полученным при разрешении имени, и использует первое успешное соединение, избегая медленного последовательного перебора IP-адресов. Настройте его для База данных SQL Azure, Управляемый экземпляр SQL Azure, SQL Database в Microsoft Fabric, слушателей групп доступности и экземпляров отказоустойчивого кластера. Это безопасно для целевых систем с одним IP-адресом. Он не поддерживается для именованных экземпляров, протоколов, отличных от TCP, экземпляров с более чем 64 IP-адресами или зеркалирования базы данных, использование которого не рекомендуется. Вместо этого используйте группы доступности AlwaysOn. Для получения дополнительной информации см. разделы «Высокая доступность и восстановление после катастроф » и «Отключение разрешения IP прозрачной сети». -
ConnectRetryCount = 3иConnectRetryInterval = 10: Драйвер повторно пытается выполнить операцию при временных сбоях, подпадающих под условия, во времяOpen(), а при следующей команде повторно устанавливает разорванное неактивное соединение. Количество по умолчанию — 1. Три попытки с интервалом в 10 секунд в сумме длятся дольше, чем более длительная перенастройка или аварийное переключение. Драйвер повышает 1–2 только тогда, когда имя сервера заканчивается известным доменом Azure SQL, например.database.windows.net, поэтому пользовательский DNS-псевдоним получает 1. -
openRetry: Назначенный SqlConnection.RetryLogicProvider, он добавляет экспоненциальную задержку дляOpen(). Драйвер останавливает внутренние повторные попытки по истеченииConnectTimeout, поэтому в худшем случае до того, какOpenAsyncсгенерирует исключение, будет выполнено пять попыток длительностью до 30 секунд каждая, плюс задержка между повторами. Каждая попытка повторного подключения в режиме простоя также запускает полнуюopenRetryполитику, и когда эта политика исчерпает свои повторные попытки, восстановление в простое заканчивается. -
Безсерверная автопауза: Для База данных SQL Azure serverless увеличьте
ConnectTimeoutкак минимум до 60 секунд. ПервыйOpen()может завершиться с ошибкой40613во время возобновления базы данных, иopenRetryповторяет попытку. Тайм-аут на стороне клиента проявляется как ошибка-2, для которой не выполняется повторная попытка, поэтому каждая попытка подключения должна длиться дольше возобновления. Для получения дополнительной информации смотрите разделы «Автопауза и автовозобновление». -
commandRetry: Прикрепляйте его к SqlCommand.RetryLogicProvider только если безопасно повторно выполнять команду: операции чтения,MERGEзащищённые естественным ключом, upsert-операции через сохранённую процедуру и другие идемпотентные операции. Он пропускает повторную попытку внутри транзакции, поэтому код приложения должен повторно выполнять многооператорные транзакции.ExecuteReaderиExecuteScalarповторяют попытку только для ошибок, возвращённых до начала первого набора результатов.ExecuteNonQueryповторно выполняет весь вызов. -
Список временных ошибок: Настройка
TransientErrorsзаменяет встроенный список. Чтобы вместо этого расширить его, используйте SqlConfigurableRetryFactory.BaselineTransientErrors (Microsoft.Data.SqlClient 7.0 и более поздних версий). -
RetryingСобытие: Retrying срабатывает перед каждой повторной попыткой с учетом количества повторных попыток, следующей задержки и исключений на данный момент. Направьте его в ILogger или в ваш телеметрический конвейер. - Исключения: метод не перехватывает исключения. Истощённый провайдер выбрасывает AggregateException с исключением из каждой попытки. Не временная ошибка распространяется как исходное исключение. Вызывающая сторона записывает его один раз вместе с остальной информацией запроса.
-
Отмена: CancellationToken останавливает ожидание поставщика между повторными попытками. Он не прерывает ожидание
ConnectRetryIntervalводителя в рамках однойOpenпопытки. Для получения дополнительной информации см. раздел «Асинхронное программирование». - Время жизни провайдера: Фрагмент создаёт провайдеры повторных попыток при каждом вызове, чтобы оставаться самостоятельным. В приложении создайте их один раз и используйте повторно.
Дополнительные сведения о каждой части этой конфигурации см. в следующей статье:
- строки подключения
- Аутентификация Microsoft Entra
- Шифрование и проверка сертификатов
- Настраиваемая логика повторных попыток
- Высокий уровень доступности и аварийное восстановление
Изучите основные задачи доступа к данным
После подключения используйте эти статьи в порядке:
- Выполните команду для выбора формы набора результатов и запустите Transact-SQL (T-SQL).
- Настройте параметры для соответствия контракту базы данных.
- Получайте данные с помощью SqlDataReader для обработки строк и нескольких результатов.
- Модифицировать данные с помощью сохранённых процедур, использующих выходные параметры и возвращаемые значения.
- Используйте асинхронное программирование и отмену для добавления отмены со стороны вызывающего кода и ограниченных тайм-аутов.
- Обрабатывайте ошибки и сообщения до того, как добавлять повторные попытки или диагностику в продакшене.
Ключевые особенности
- Современная поддержка .NET: работает на текущих версиях .NET и .NET Framework. Для разбивки по версиям см . Жизненный цикл поддержки.
-
По умолчанию зашифровано: соединения с TLS-шифрованием и
Encrypt=trueпо умолчанию. НастройтеEncrypt=Strictдля шифрования TDS 8.0. - Аутентификация Microsoft Entra ID: подключения без пароля с использованием управляемого удостоверения, субъекта-службы, интерактивного потока, интегрированного потока, цепочки учетных данных по умолчанию и потока токена доступа.
- Kerberos и NTLM: Интегрированная проверка подлинности Windows для локальной Active Directory и устаревших сценариев.
- Always Encrypted: шифрование на стороне клиента для конфиденциальных столбцов с необязательными безопасными анклавами для операций на месте.
- Массовое копирование: высокопроизводительные вставки с SqlBulkCopy.
- Пул соединений: по умолчанию включён. На этапе оценки находится пул V2 с подключением по запросу.
-
Устойчивость соединения: встроенные повторные попытки соединения (
ConnectRetryCountиConnectRetryInterval) плюс настраиваемая логика повторных попыток для соединений и команд. -
Богатые типы данных SQL Server:
datetimeoffset,sql_variant, JSON, векторные, пространственные, XML и табличные параметры. - Диагностика: отслеживание источников событий, диагностические счётчики, статистика поставщиков и специальное руководство по устранению неполадок.
-
Идентификатор приложения: Установите
SqlConnection.RegisteredApplicationдля идентификации вашей библиотеки или инструмента в SQL Server (Microsoft.Data.SqlClient 7.1 и новее).
Get started
| Статья | Description |
|---|---|
| Начните с драйвера SqlClient | Настройте проект, создайте базу данных, подключитесь, отправьте запросы и добавьте устойчивость соединений. |
| Установка, обновление и развертывание Microsoft. Data.SqlClient | Установите пакеты NuGet, выберите релиз, обновите драйвер и подготовьте вывод развертывания. |
| Жизненный цикл поддержки | Проверьте поддерживаемые версии драйверов и даты поддержки. |
| Переход с System.Data.SqlClient на Microsoft. Data.SqlClient | Обновить ссылки на пакеты, пространства имён, конфигурацию и изменённое поведение драйверов. |
| Пространство имён Microsoft.Data.SqlClient и совместимость | Узнайте, как SqlClient реализует поддержку ADO.NET и обеспечивает совместимость с System.Data.SqlClient, .NET и SQL Server. |
| Что нового в Microsoft. Data.SqlClient | Найдите актуальные релизы, крупные изменения в обновлениях и заметки по выпуску релизов. |
Настройка и подключение
| Статья | Description |
|---|---|
| Подключитесь к источнику данных | Открывайте и управляйте соединениями и реагируйте на изменения состояния соединения. |
| строки подключения | Настройте поведение сервера, базы данных, аутентификации, шифрования и подключения. |
| Шифрование и проверка сертификатов | Настройте зашифрованные соединения и проверку сертификатов сервера. |
| Пул подключений SQL Server | Эффективно используйте физические соединения. |
| Обработка ошибок и сообщений | Отслеживайте ошибки и получайте информационные сообщения. |
Аутентифицировать и защитить
| Статья | Description |
|---|---|
| Лучшие практики безопасности для Microsoft. Data.SqlClient | Проверьте рекомендации по аутентификации, авторизации и безопасности приложений. |
| Аутентификация Microsoft Entra | Подключайтесь к управляемой идентификации, принципу сервиса, паролям и интерактивным потокам. |
| Защита информации о соединениях | Держите учетные данные и настройки соединения вне кода приложения. |
| Всегда зашифрованный | Защитить чувствительные значения столбцов от системы базы данных. |
| Всегда зашифровано с безопасными анклавами | Выполняйте сложные операции с зашифрованными данными с помощью защищённого анклава. |
Получение и обновление данных
| Статья | Description |
|---|---|
| Выполнить команду | Выполнять параметризованные операторы SQL и хранимые процедуры. |
| DataAdapters и DataReaders | Передавайте наборы результатов в потоковом режиме или заполняйте автономные структуры данных. |
| Выполните несколько команд с помощью SqlBatch | Отправьте упорядоченный набор команд и обработайте их результаты. |
| Потоковые данные | Передавать большие бинарные, текстовые, XML и JSON-значения без буферизации всего значения. |
| Транзакции и параллелизм | Используйте локальные и распределённые транзакции, а также контроли параллелизма. |
| Получить информацию о схеме базы данных | Откройте для себя коллекции схем и ограничения. |
| Операции массового копирования | Эффективно загружайте большие наборы данных с помощью SqlBulkCopy. |
| Параметры, возвращающие табличные значения | Отправьте несколько строк в параметризованное выражение или хранимую процедуру. |
| Множественные активные наборы результатов (MARS) | Чередуйте несколько пакетов в одном соединении. |
Типы данных
| Статья | Description |
|---|---|
| Отображения типов данных SQL Server | Сопоставьте типы SQL Server с типами .NET и System.Data.SqlTypes. |
| Данные JSON | Отправьте и извлекайте тип данных SQL Server json. |
| Векторные данные | Отправляйте и получайте векторные значения. |
| XML-данные | Читать, записывать и параметризировать значения XML. |
| Бинарные и крупнозначительные данные | Потоковая передача и обновление двоичных данных, FILESTREAM и данных большого размера. |
Надёжность и диагностика
| Статья | Description |
|---|---|
| Настраиваемая логика повторных попыток | Повторяйте попытки при временных сбоях подключения и выполнения команд с помощью ограниченных стратегий повторных попыток. |
| Высокий уровень доступности и аварийное восстановление | Подключайтесь к группам доступности и партнёрам по отказу. |
| Счетчики событий в SqlClient | Отслеживайте активные соединения, объединённые соединения и другие метрики драйверов. |
| Включить трассировку источников событий | Фиксируйте детальные события водителя для диагностики. |
| Руководство по устранению неполадок с SqlClient | Диагностируйте распространённые проблемы с подключением и драйверами. |
| Уведомления о запросах | Получайте уведомления при изменении результатов запросов. |
Функции SQL Server
| Статья | Description |
|---|---|
| Функции SQL Server и ADO.NET | Просмотрите функции, специфичные для SQL Server, доступные через SqlClient. |
| Локальная база данных | Подключитесь к экземплярам SQL Server Express LocalDB. |
| Обнаружение и классификация данных | Читайте метаданные классификации чувствительности из наборов результатов. |
Справочник и ресурсы
| Статья | Description |
|---|---|
| Справочник по API Microsoft.Data.SqlClient | Просмотрите справочник по API .NET для драйвера. |
| Переключатели AppContext | Настройте совместимость и поведение безопасности. |
| Репозиторий Microsoft.Data.SqlClient на сайте GitHub | Читайте исходный код драйвера, заметки к релизу и образцы. |
| Примеры Microsoft.Data.SqlClient | Просмотрите примеры C# для API драйверов. |
| .NET runtime репозиторий GitHub | Прочитайте источник для библиотек среды выполнения .NET. |
Запрашивание функции
Чтобы предложить новую функцию, создайте обращение в репозитории GitHub Microsoft.Data.SqlClient.