Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Excepciones al conectar con SQL Server
Hay varias razones por las que no se puede establecer la conexión. A continuación se muestran algunas sugerencias de solución de problemas que se pueden usar como guía para analizar y resolver muchos de estos problemas.
No se puede cargar la biblioteca SNI (Indicación de nombre de servidor) nativa
Problemas en aplicaciones .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 es la biblioteca nativa de C++ de la que SqlClient depende para varias operaciones de red cuando se ejecuta en Windows. En las aplicaciones .NET Framework que se compilan con el SDK de proyecto de MSBuild, los archivos DLL nativos no se administran con comandos de restauración. Por lo tanto, un archivo .targets se incluye en el paquete de Microsoft.Data.SqlClient.SNI NuGet que define las operaciones "Copiar" necesarias.
El archivo .targets incluido se autoreferencia cuando se realiza una dependencia directa en la biblioteca Microsoft.Data.SqlClient. En escenarios en los que se hace una referencia transitiva (indirecta), se debe hacer referencia manualmente a este .targets archivo para asegurarse de que las operaciones de "copia" se pueden ejecutar cuando sea necesario.
Solución recomendada: Asegúrese de que se hace referencia al .targets archivo de proyecto de la aplicación para asegurarse de que se ejecutan las operaciones de "Copia". Puede encontrar un ejemplo de las modificaciones en un archivo del proyecto en este problema de GitHub relacionado.
Estos destinos abarcan únicamente los destinos conocidos y de uso común de Microsoft. Si una aplicación o herramienta externa define destinos personalizados para copiar archivos binarios, los mantenedores de herramientas deben definir nuevos destinos para asegurarse de que los archivos DLL de SNI nativos se copian junto con los Microsoft.Data.SqlClient.dll archivos binarios y están disponibles al ejecutar aplicaciones cliente.
Problemas en aplicaciones .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
Este error puede producirse solo en las aplicaciones de Windows. En el caso de que se produzca en un entorno de UNIX, debe asegurarse de que la aplicación se ha compilado correctamente para tener como destino un entorno de ejecución de UNIX y no de Windows.
SNI es la biblioteca nativa de C++ de la que SqlClient depende para varias operaciones de red cuando se ejecuta en Windows. Microsoft.Data.SqlClient no administra la carga y descarga de esta biblioteca en .NET Core.
Solución recomendada: asegúrese de que se conceden los permisos "Execute" en el sistema de archivos donde se cargan las bibliotecas nativas del entorno de ejecución en el proceso de .NET Core. Si esto no soluciona el problema, puede publicar una incidencia en el repositorio de dotnet/runtime para recibir más asistencia.
Errores de SNI nativo (PDB no encontrado)
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'
Solución recomendada: asegúrese de que la aplicación cliente hace referencia a la versión mínima v2.1.0 del paquete Microsoft.Data.SqlClient. Al usar EF Core, agregue una referencia a esta versión de paquete de Microsoft.Data.SqlClient directamente para invalidar la dependencia.
Errores de resolución de nombre de host
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
El protocolo TCP/canalizaciones con nombre no está habilitado en SQL Server
Solución recomendada: habilite el protocolo TCP/canalizaciones con nombre en la instancia de SQL Server desde la consola de Administrador de configuración de SQL Server.
Nombre de host desconocido
Solución recomendada: asegúrese de que el nombre de host se resuelve en la dirección IP del servidor desde el cliente en el que se inicia la conexión.
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)
Posibles motivos y soluciones
SQL Server no admite TLS 1.2
Este error se produce normalmente en entornos cliente como contenedores de imágenes de Docker, clientes UNIX o clientes Windows, donde TLS 1.2 es el protocolo TLS mínimo admitido.
Solución recomendada: Instale las actualizaciones más recientes en versiones compatibles de SQL Server y asegúrese de que el protocolo TLS 1.2 está habilitado en el servidor.
Note
Vea el ciclo de vida de compatibilidad del controlador SqlClient para la lista de versiones de SQL Server admitidas con diferentes versiones de
Microsoft.Data.SqlClient.Solución no segura: configure los valores de TLS/SSL en el entorno de cliente/imagen de Docker para conectarse con TLS 1.0.
MinProtocol = TLSv1 CipherString = DEFAULT@SECLEVEL=1Note
Al conectarse con
Microsoft.Data.SqlClientv2.0+ desde un entorno de Windows/Linux con TLS 1.0 o TLS 1.1, se produce un mensaje de advertencia de seguridad si el cliente y SQL Server de destino no pueden negociar un mínimo de TLS versión 1.2 al establecer la conexión: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.Cifrado aplicado de SQL Server
Si el servidor de destino es una instancia de Azure SQL o un servidor SQL local con la propiedad "Forzar cifrado" activada, se establece una conexión cifrada, para lo cual el cliente debe establecer la confianza con el servidor.
Solución recomendada: hay dos opciones disponibles para solucionar este problema:
- Instale el certificado TLS de SQL Server de destino en el entorno de cliente. Si es necesario, se validará el cifrado.
- (Menos seguro) Establezca la propiedad "TrustServerCertificate=true" de la cadena de conexión.
Solución no segura: deshabilite la opción "Forzar cifrado" en SQL Server.
Certificado TLS no firmado con SHA-256 o superior.
Solución recomendada: Genere un nuevo certificado TLS para el servidor cuyo hash esté firmado con al menos el algoritmo hash SHA-256.
Conjuntos de cifrado restringidos en Linux con .NET 5 o posterior
.NET 5 presentó un cambio importante para los clientes de Linux, donde se utiliza de forma predeterminada una lista restringida de conjuntos de cifrado permitidos. Es posible que tenga que expandir la lista predeterminada del conjunto de cifrado para aceptar clientes heredados (o para ponerse en contacto con los servidores heredados) especificando un
CipherSuitePolicyvalor o cambiando el archivo de configuración de OpenSSL .Obtenga más información sobre los conjuntos de cifrado TLS predeterminados para .NET en Linux para obtener una acción recomendada.
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.Cifrado aplicado de SQL Server
Si el servidor de destino es una instancia de SQL Server local con la propiedad "Forzar cifrado" activada y un certificado autofirmado, se realizará una conexión cifrada, para lo cual el cliente debe establecer una relación de confianza con el servidor.
Solución recomendada: hay dos opciones disponibles para solucionar este problema:
- Instale el certificado TLS de SQL Server de destino en el entorno de cliente. Si es necesario, se validará el cifrado.
- (Menos seguro) Establezca la propiedad "TrustServerCertificate=true" de la cadena de conexión.
Solución no segura: deshabilite la opción "Forzar cifrado" en SQL Server.
Errores de agotamiento del grupo de conexiones
Traza de pila observada:
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.
Posibles motivos y soluciones
La aplicación cliente está abriendo más conexiones de las que el grupo de conexiones puede mantener activas en un momento dado.
Solución recomendada: configure la propiedad de conexión "Max Pool Size" en un valor más alto y cierre las conexiones sin usar de manera oportuna.
Contact Support
Si esta guía no resuelve los problemas de conectividad, puede ver los problemas existentes en el repositorio dotnet/sqlclient y abrir un nuevo problema si es necesario.