Compartir a través de


Guía de solución de problemas de SqlClient

Descargar ADO.NET

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

Seguimiento de la pila observado:

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, se incluye un archivo ".targets" en el paquete NuGet "Microsoft.Data.SqlClient.SNI" que define las operaciones "Copy" necesarias.

Se hace referencia automáticamente al archivo ".targets" incluido cuando se realiza una dependencia directa a la biblioteca "Microsoft.Data.SqlClient". En escenarios en los que se realiza una referencia transitiva (indirecta), se debe hacer referencia manualmente a este archivo ".targets" para asegurarse de que las operaciones "Copy" se puedan ejecutar cuando sea necesario.

Solución recomendada: Asegúrese de que se hace referencia al archivo ".targets" en el archivo del proyecto de la aplicación para garantizar que se ejecutan las operaciones "Copy". 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 herramienta o aplicación externa define destinos personalizados para copiar archivos binarios, deben definirse nuevos destinos con los mantenedores de herramientas para asegurarse de que se copian los archivos DLL de SNI nativos en los archivos binarios de Microsoft.Data.SqlClient.dll y que están disponibles cuando se ejecutan aplicaciones cliente.

Problemas en aplicaciones .NET Core

Seguimiento de la pila observado:

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.

Nota

Es posible que este error se produzca solo en aplicaciones 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)

Seguimiento de la pila observado:

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 del paquete de Microsoft.Data.SqlClient directamente para invalidar la dependencia.

Errores de resolución de nombre de host

Seguimiento de la pila observado:

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

Razones posibles

  • 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.

Errores de fase de inicio de sesión

Seguimientos de la pila observados:

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 las versiones admitidas de SQL Server1 y asegúrese de que el protocolo TLS 1.2 está habilitado en el servidor.

    1 Vea el ciclo de vida de soporte del controlador SqlClient para consultar la lista de versiones admitidas de SQL Server 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=1
    

    Nota

    Al conectarse con Microsoft.Data.SqlClient v2.0+ desde un entorno de Windows/Linux con TLS 1.0 o TLS 1.1, aparecerá un mensaje de advertencia de seguridad si el servidor SQL Server de destino y el cliente no pueden negociar un mínimo de la versión de TLS 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:

    1. Instale el certificado TLS/SSL del servidor SQL Server de destino en el entorno del cliente. Si es necesario, se validará el cifrado.
    2. (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.

  • Certificados TLS/SSL no firmados con SHA-256 o superior.

    Solución recomendada: genere un nuevo certificado TLS/SSL 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 de conjuntos de cifrado predeterminados para aceptar clientes heredados (o para ponerse en contacto con servidores heredados), especificando un valor CipherSuitePolicy 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 la 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:

    1. Instale el certificado TLS/SSL del servidor SQL Server de destino en el entorno del cliente. Si es necesario, se validará el cifrado.
    2. (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

Seguimiento de la pila observado:

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.

Ponerse en contacto con el servicio de soporte técnico

Si esta guía no soluciona los problemas de conectividad, puede ver las incidencias existentes en el repositorio dotnet/sqlclient y publicar una nueva si fuera necesario.