Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Exceções ao se conectar ao SQL Server
Existem várias razões pelas quais a conexão pode não ser estabelecida. Aqui estão algumas dicas de solução de problemas que podem ser usadas como um guia para analisar e resolver muitos dos problemas.
Não é possível carregar a biblioteca SNI (Server Network Interface) nativa
Problemas em aplicativos .NET Framework
Stacktrace observou:
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 é a biblioteca C++ nativa da qual o SqlClient depende para várias operações de rede quando executado no Windows. Em aplicativos .NET Framework que são criados com o SDK do projeto MSBuild, DLLs nativas não são gerenciadas com comandos de restauração. Portanto, um .targets arquivo é incluído no Microsoft.Data.SqlClient.SNI pacote NuGet que define as operações de "Cópia" necessárias.
O arquivo incluído .targets é referenciado automaticamente quando uma dependência direta é feita para a Microsoft.Data.SqlClient biblioteca. Em cenários em que uma referência transitiva (indireta) é feita, esse .targets arquivo deve ser referenciado manualmente para garantir que as operações de "Cópia" possam ser executadas quando necessário.
Solução recomendada: Verifique se o .targets arquivo está referenciado no arquivo de projeto do aplicativo para garantir que as operações "Copiar" sejam executadas. Um exemplo de edições em um arquivo de projeto pode ser encontrado neste problema relacionado ao GitHub.
Esses alvos abrangem apenas os alvos conhecidos e comumente usados da Microsoft. Se uma ferramenta ou aplicativo externo definir destinos personalizados para copiar binários, novos destinos deverão ser definidos pelos mantenedores da ferramenta para garantir que as DLLs SNI nativas sejam copiadas ao lado dos Microsoft.Data.SqlClient.dll binários e estejam disponíveis ao executar aplicativos cliente.
Problemas em aplicativos .NET Core
Stacktrace observou:
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 erro pode ocorrer apenas em aplicações do Windows. Se isso ocorrer num ambiente Unix, deve garantir que a sua aplicação seja desenvolvida para funcionar num sistema Unix e não em Windows.
SNI é a biblioteca C++ nativa da qual o SqlClient depende para várias operações de rede quando executado no Windows.
Microsoft.Data.SqlClient não gerencia o carregamento/descarregamento dessa biblioteca no .NET Core.
Solução recomendada: Certifique-se de que as permissões "Executar" sejam concedidas no sistema de arquivos onde as bibliotecas de tempo de execução nativas são carregadas no processo .NET Core. Se isso não resolver o problema, você pode arquivar um problema no repositório dotnet/runtime para obter suporte adicional.
Erros de SNI nativo (pdb não encontrado)
Stacktrace observou:
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'
Solução recomendada: Certifique-se de que o aplicativo cliente faça referência à versão v2.1.0 mínima do pacote Microsoft.Data.SqlClient. Ao utilizar o EF Core, adicione uma referência à versão deste pacote diretamente no Microsoft.Data.SqlClient para substituir a dependência.
Erros de resolução de nome de host
Stacktrace observou:
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
Motivos possíveis
O protocolo TCP/pipes nomeados não está habilitado no SQL Server
Solução recomendada: Habilite o protocolo TCP/pipes nomeados na instância do SQL Server a partir do console do SQL Server Configuration Manager.
Nome do host desconhecido
Solução recomendada: Verifique se o nome do host é resolvido para o endereço IP do servidor a partir do cliente onde a conexão está sendo iniciada.
Erros na fase de início de sessão
Stacktraces observado:
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)
Possíveis razões e soluções
O SQL Server não oferece suporte a TLS 1.2
Este erro normalmente ocorre em ambientes de cliente como contêineres de imagem docker, clientes Unix ou clientes Windows onde TLS 1.2 é o protocolo TLS mínimo suportado.
Solução recomendada: Instale as atualizações mais recentes em versões com suporte do SQL Server e verifique se o protocolo TLS 1.2 está habilitado no servidor.
Note
Exiba o ciclo de vida de suporte do driver SqlClient para obter a lista de versões suportadas do SQL Server com diferentes versões do
Microsoft.Data.SqlClient.Solução insegura: Configure as configurações de TLS/SSL no ambiente de imagem/cliente do docker para se conectar ao TLS 1.0.
MinProtocol = TLSv1 CipherString = DEFAULT@SECLEVEL=1Note
Ao conectar-se com
Microsoft.Data.SqlClientv2.0+ de um ambiente Windows/Linux com TLS 1.0 ou TLS 1.1, uma mensagem de aviso de segurança será lançada se o SQL Server de destino e o cliente não puderem negociar um mínimo de TLS versão 1.2 ao estabelecer a conexão: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.Criptografia imposta do SQL Server
Se o Servidor de destino for uma instância SQL do Azure ou um SQL Server local com a propriedade "Forçar Criptografia" ativada, será feita uma conexão criptografada, para a qual o cliente deverá estabelecer confiança com o servidor.
Solução recomendada: Há duas opções disponíveis para corrigir esse problema:
- Instale o certificado TLS do SQL Server de destino no ambiente cliente. Verifica-se se é necessária a encriptação.
- (Menos seguro) Defina a propriedade "TrustServerCertificate=true" na cadeia de conexão.
Solução insegura: Desative a configuração "Forçar criptografia" no SQL Server.
Certificados TLS não assinados com SHA-256 ou superior.
Solução recomendada: Gere um novo certificado TLS para o servidor cujo hash é assinado com pelo menos o algoritmo de hash SHA-256.
Conjuntos de cifras fortemente restritos no Linux com .NET 5+
O .NET 5 introduziu uma mudança de quebra para clientes Linux, onde uma lista fortemente restrita de pacotes de codificação permitidos é usada por padrão. Talvez seja necessário expandir a lista padrão de suítes de cifras para aceitar clientes legados (ou para contatar servidores legados), especificando um valor
CipherSuitePolicyou alterando o arquivo de configuração OpenSSL.Leia mais em Conjuntos de cifras TLS padrão para .NET no Linux para ações recomendadas.
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.Criptografia imposta do SQL Server
Se o servidor de destino for um SQL Server local com a propriedade "Forçar criptografia" ativada e um certificado autoassinado, será feita uma conexão criptografada, para a qual o cliente deverá estabelecer confiança com o servidor.
Solução recomendada: Há duas opções disponíveis para corrigir esse problema:
- Instale o certificado TLS do SQL Server de destino no ambiente cliente. Verifica-se se é necessária a encriptação.
- (Menos seguro) Defina a propriedade "TrustServerCertificate=true" na cadeia de conexão.
Solução insegura: Desative a configuração "Forçar criptografia" no SQL Server.
Erros de exaustão do pool de conexões
Traço de pilha 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.
Possíveis razões e soluções
O aplicativo cliente está abrindo mais conexões do que o pool de conexões pode manter ativo em um determinado momento.
Solução recomendada: Configure a propriedade de conexão "Max Pool Size" para um valor mais alto e feche as conexões não utilizadas em tempo hábil.
Contactar o Suporte
Se este guia não resolver seus problemas de conectividade, você poderá visualizar os problemas existentes no repositório dotnet/sqlclient e abrir um novo problema, se necessário.