Заметка
Доступ к этой странице требует авторизации. Вы можете попробовать войти в систему или изменить каталог.
Доступ к этой странице требует авторизации. Вы можете попробовать сменить директорию.
Исключения при подключении к SQL Server
Есть несколько причин, по которым не удается установить подключение. Ниже приведены некоторые советы по устранению неполадок, которые можно использовать в качестве руководства для анализа и решения многих проблем.
Не удается загрузить собственную библиотеку SNI (сетевой интерфейс сервера)
Проблемы в приложениях .NET Framework
Stacktrace observed:
TypeInitializationException: The type initializer for 'Microsoft.Data.SqlClient.SNILoadHandle' threw an exception.
DllNotFoundException: Unable to load DLL 'Microsoft.Data.SqlClient.SNI.x64.dll': The specified module could not be found. (Exception from HRESULT: 0x8007007E)
TypeInitializationException: The type initializer for 'Microsoft.Data.SqlClient.SNILoadHandle' threw an exception.
DllNotFoundException: Unable to load DLL 'Microsoft.Data.SqlClient.SNI.x86.dll': The specified module could not be found. (Exception from HRESULT: 0x8007007E)
SNI — это нативная библиотека C++, на основе которой в SqlClient выполняются различные сетевые операции при работе в Windows. В приложениях .NET Framework, созданных с помощью пакета SDK для проекта MSBuild, управление нативными библиотеками DLL не осуществляется с помощью команд восстановления. Файл .targets включен в пакет Microsoft.Data.SqlClient.SNI NuGet, который определяет необходимые операции "копирования".
Включенный .targets файл автоматически связывается, когда создается прямая зависимость от библиотеки Microsoft.Data.SqlClient. В сценариях, когда выполняется транзитивная (непрямая) ссылка, этот .targets файл необходимо указать вручную, чтобы гарантировать, что операции копирования могут выполняться при необходимости.
Рекомендуемое решение: Убедитесь, что .targets файл указан в файле проекта приложения для выполнения операций "Копировать". Пример изменений в файле проекта можно найти в этой связанной проблеме GitHub.
Среди этих целевых объектов только известные и часто используемые целевые объекты Майкрософт. Если внешнее средство или приложение определяет пользовательские цели для копирования двоичных файлов, новые цели должны быть определены обслуживающими средствами, чтобы обеспечить копирование собственных библиотек DLL SNI вместе с Microsoft.Data.SqlClient.dll двоичными файлами и чтобы они были доступны при выполнении клиентских приложений.
Проблемы в приложениях .NET Core
Stacktrace observed:
System.TypeInitializationException: The type initializer for 'Microsoft.Data.SqlClient.TdsParser' threw an exception.
---> System.TypeInitializationException: The type initializer for 'Microsoft.Data.SqlClient.SNILoadHandle' threw an exception.
---> System.DllNotFoundException: Unable to load shared library 'Microsoft.Data.SqlClient.SNI.dll' or one of its dependencies.
Note
Эта ошибка может возникать только в приложениях Windows. Если это происходит в среде Unix, убедитесь, что приложение создано для среды выполнения UNIX, а не для Windows.
SNI — это нативная библиотека C++, на основе которой в SqlClient выполняются различные сетевые операции при работе в Windows.
Microsoft.Data.SqlClient не управляет загрузкой и выгрузки этой библиотеки в .NET Core.
Рекомендуемое решение. Убедитесь, что разрешения Execute предоставляются в файловой системе, где собственные библиотеки среды выполнения загружаются в процессе .NET Core. Если это не помогло решить проблему, можно зарегистрировать ее в репозитории dotnet/runtime, чтобы получить дальнейшую поддержку.
Ошибки нативной функции SNI (не удалось найти PDB)
Stacktrace observed:
An assembly specified in the application dependencies manifest (sql2csv.deps.json) was not found:
package: 'Microsoft.Data.SqlClient.SNI.runtime', version: '2.0.0'
path: 'runtimes/win-x64/native/Microsoft.Data.SqlClient.SNI.pdb'
Рекомендуемое решение. Убедитесь, что клиентское приложение ссылается на минимальную версию пакета Microsoft.Data.SqlClient версии 2.1.0 . При использовании EF Core добавьте ссылку на эту версию пакета Microsoft.Data.SqlClient, чтобы напрямую переопределить зависимости.
Ошибки разрешения имени узла
Stacktrace observed:
Microsoft.Data.SqlClient.SqlException (0x80131904): A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible.
Verify that the instance name is correct and that SQL Server is configured to allow remote connections.
(provider: TCP Provider, error: 0 - No such host is known.)
Microsoft.Data.SqlClient.SqlException (0x80131904): A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible.
Verify that the instance name is correct and that SQL Server is configured to allow remote connections.
(provider: TCP Provider, error: 35 - An internal exception was caught)
Microsoft.Data.SqlClient.SqlException (0x80131904): A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible.
Verify that the instance name is correct and that SQL Server is configured to allow remote connections.
(provider: TCP Provider, error: 35 - An internal exception was caught)
---> System.Net.Internals.SocketExceptionFactory+ExtendedSocketException (00000005, 0xFFFDFFFF): Name does not resolve
Possible reasons
В SQL Server не включен протокол TCP или протокол именованных каналов
Рекомендуемое решение. Включите протокол TCP/Именованных каналов в экземпляре SQL Server из консоли диспетчер конфигурации SQL Server.
Имя узла неизвестно
Рекомендуемое решение. Убедитесь, что имя узла разрешает IP-адрес сервера от клиента, где инициируется подключение.
Login-phase errors
Stacktraces observed:
Microsoft.Data.SqlClient.SqlException (0x80131904): A connection was successfully established with the server, but then an error occurred during the pre-login handshake.
(provider: SSL Provider, error: 31 - Encryption(ssl/tls) handshake failed)
System.IO.EndOfStreamException: End of stream reached
A connection was successfully established with the server, but then an error occurred during the login process.
(provider: SSL Provider, error: 0 - The target principal name is incorrect.)
Microsoft.Data.SqlClient.SqlException (0x80131904): Connection Timeout Expired. The timeout period elapsed during the post-login phase. The connection could have timed out while waiting for server to complete the login process and respond; Or it could have timed out while attempting to create multiple active connections.
The duration spent while attempting to connect to this server was - [Pre-Login] initialization=837; handshake=394; [Login] initialization=3; authentication=15; [Post-Login] complete=1027;
---> System.ComponentModel.Win32Exception (258): Unknown error 258
at Microsoft.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action1 wrapCloseInAction)
Возможные причины и решения
SQL Server не поддерживает TLS 1.2
Эта ошибка обычно происходит в клиентских средах, таких как контейнеры образов Docker, клиенты Unix или клиенты Windows, где TLS 1.2 является минимальной поддерживаемой версией протокола TLS.
Рекомендуемое решение: Установите последние обновления в поддерживаемых версиях SQL Server и убедитесь, что протокол TLS 1.2 включен на сервере.
Note
Просмотрите жизненный цикл поддержки драйвера SqlClient для списка поддерживаемых версий SQL Server с различными версиями
Microsoft.Data.SqlClient.Небезопасное решение. Настройка параметров TLS/SSL в среде docker image/client для подключения к TLS 1.0.
MinProtocol = TLSv1 CipherString = DEFAULT@SECLEVEL=1Note
При подключении к
Microsoft.Data.SqlClientv2.0+ из среды Windows/Linux с использованием TLS 1.0 или TLS 1.1 возникает предупреждение о безопасности, если целевой SQL Server и клиент не могут согласовать TLS версии 1.2 или выше при установлении соединения.Security Warning: The negotiated <TLS1.0 | TLS1.1> is an insecure protocol and is supported for backward compatibility only. The recommended protocol version is TLS 1.2 and later.Принудительное шифрование SQL Server
Если целевой сервер является экземпляром SQL Azure или локальным SQL Server с включенным свойством "Принудительное шифрование", выполняется зашифрованное подключение, для которого клиент должен установить доверие к серверу.
Рекомендуемое решение. Существует два доступных варианта для устранения этой проблемы:
- Установите целевой сертификат TLS SQL Server в клиентской среде. Он проверяется, требуется ли шифрование.
- (менее безопасный) Задайте свойство TrustServerCertificate=true в строка подключения.
Небезопасное решение: отключите параметр "Принудительное шифрование" в SQL Server.
Сертификаты TLS не подписаны с помощью SHA-256 или более поздней версии.
Рекомендуемое решение: Создайте новый сертификат TLS для сервера, хэш которого подписан по крайней мере с алгоритмом хэширования SHA-256.
Строго ограниченный список комплектов шифров TLS для .NET 5 и более поздних версий в Linux
В .NET 5 представлено критическое изменение для клиентов Linux, которое заключается в использовании строго ограниченного списка разрешенных комплектов шифров по умолчанию. Возможно, потребуется расширить список наборов шифров по умолчанию, чтобы принять устаревшие клиенты (или связаться с устаревшими серверами), указав значение
CipherSuitePolicyили изменив файл конфигурации OpenSSL.Подробную информацию о наборах шифров TLS по умолчанию для .NET на Linux см. для получения рекомендаций по дальнейшим действиям.
Microsoft.Data.SqlClient.SqlException (0x80131904): A connection was successfully established with the server, but then an error occurred during the login process. (provider: SSL Provider, error: 0 - The certificate chain was issued by an authority that is not trusted.) ---> System.ComponentModel.Win32Exception (0x80090325): The certificate chain was issued by an authority that is not trusted.Принудительное шифрование SQL Server
Если целевой сервер является локальным SQL Server со свойством Force Encryption, включенным и самозаверяющий сертификат, выполняется зашифрованное подключение, для которого клиент должен установить доверие к серверу.
Рекомендуемое решение. Существует два доступных варианта для устранения этой проблемы:
- Установите целевой сертификат TLS SQL Server в клиентской среде. Он проверяется, требуется ли шифрование.
- (менее безопасный) Задайте свойство TrustServerCertificate=true в строка подключения.
Небезопасное решение: отключите параметр "Принудительное шифрование" в SQL Server.
Проблема, вызванная тем, что пул подключений исчерпан
Отслеживаемая трассировка стека:
System.InvalidOperationException: Timeout expired. The timeout period elapsed prior to obtaining a connection from the pool.
This may have occurred because all pooled connections were in use and max pool size was reached.
Возможные причины и решения
Клиентское приложение открывает больше подключений, чем пул соединений может сохранить в текущий момент.
Рекомендуемое решение. Настройте свойство подключения Max Pool Size для более высокого значения и своевременно закройте неиспользуемые подключения.
Contact Support
Если это руководство не решает проблемы с подключением, вы можете просмотреть существующие проблемы в репозитории dotnet/sqlclient и при необходимости открыть новую проблему.