Share via


Probleemoplossingsgids voor SqlClient

ADO.NET downloaden

Uitzonderingen bij het maken van verbinding met SQL Server

Er zijn verschillende redenen waarom verbinding niet tot stand kan worden gebracht. Hier volgen enkele tips voor probleemoplossing die kunnen worden gebruikt als richtlijn voor het analyseren en oplossen van veel van de problemen.

Kan systeemeigen SNI-bibliotheek (Server Network Interface) niet laden

Problemen in .NET Framework-toepassingen

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 is de systeemeigen C++-bibliotheek waarop SqlClient afhankelijk is voor verschillende netwerkbewerkingen bij het uitvoeren van Windows. In .NET Framework-toepassingen die zijn gebouwd met de MSBuild Project SDK, worden systeemeigen DLL's niet beheerd met herstelopdrachten. Er wordt dus een .targets bestand opgenomen in het Microsoft.Data.SqlClient.SNI NuGet-pakket dat de benodigde kopieerbewerkingen definieert.

Het opgenomen .targets bestand wordt automatisch verwezen wanneer er een directe afhankelijkheid wordt gemaakt in de Microsoft.Data.SqlClient bibliotheek. In scenario's waarin een transitieve (indirecte) verwijzing wordt gemaakt, .targets moet dit bestand handmatig worden verwezen om ervoor te zorgen dat kopieerbewerkingen zo nodig kunnen worden uitgevoerd.

Aanbevolen oplossing: Zorg ervoor dat het .targets bestand wordt verwezen in het projectbestand van de toepassing om ervoor te zorgen dat kopieerbewerkingen worden uitgevoerd. Een voorbeeld van bewerkingen in een projectbestand vindt u in dit gerelateerde GitHub-probleem.

Deze doelen hebben betrekking op de bekende en veelgebruikte doelen van Microsoft. Als een extern hulpprogramma of een externe toepassing aangepaste doelen definieert voor het kopiëren van binaire bestanden, moeten nieuwe doelen worden gedefinieerd door hulpprogrammaonderhouders om ervoor te zorgen dat systeemeigen SNI-DLL's naast de Microsoft.Data.SqlClient.dll binaire bestanden worden gekopieerd en beschikbaar zijn bij het uitvoeren van clienttoepassingen.

Problemen in .NET Core-toepassingen

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

Deze fout kan alleen optreden in Windows-toepassingen. Als deze plaatsvindt in een Unix-omgeving, moet u ervoor zorgen dat uw toepassing is gebouwd om een Unix-runtime op de juiste wijze te richten en niet voor Windows.

SNI is de systeemeigen C++-bibliotheek waarop SqlClient afhankelijk is voor verschillende netwerkbewerkingen bij het uitvoeren van Windows. Microsoft.Data.SqlClient beheert het laden/lossen van deze bibliotheek in .NET Core niet.

Aanbevolen oplossing: Zorg ervoor dat 'Execute'-machtigingen worden verleend op het bestandssysteem waarin systeemeigen runtimebibliotheken worden geladen in het .NET Core-proces. Als dit het probleem niet oplost, kunt u een probleem indienen in de dotnet/runtime-opslagplaats voor verdere ondersteuning.

Systeemeigen SNI-fouten (pdb niet gevonden)

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'

Aanbevolen oplossing: Zorg ervoor dat de clienttoepassing verwijst naar de minimale versie v2.1.0 van het Microsoft.Data.SqlClient-pakket. Wanneer u EF Core gebruikt, voegt u een verwijzing toe naar deze pakketversie van Microsoft.Data.SqlClient rechtstreeks om afhankelijkheid te overschrijven.

Fouten bij het oplossen van hostnamen

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

  • TCP/Named Pipes Protocol is niet ingeschakeld op SQL Server

    Aanbevolen oplossing: Schakel het TCP/Named Pipes-protocol in op het SQL Server-exemplaar vanuit de SQL Server Configuration Manager-console.

  • Hostnaam niet bekend

    Aanbevolen oplossing: Zorg ervoor dat de hostnaam wordt omgezet naar het IP-adres van de server vanaf de client waar de verbinding wordt gestart.

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)

Mogelijke redenen en oplossingen

  • SQL Server biedt geen ondersteuning voor TLS 1.2

    Deze fout treedt doorgaans op in clientomgevingen zoals docker-installatiekopieëncontainers, Unix-clients of Windows-clients waarbij TLS 1.2 het minimaal ondersteunde TLS-protocol is.

    Aanbevolen oplossing: Installeer de nieuwste updates op ondersteunde versies van SQL Server en zorg ervoor dat het TLS 1.2-protocol is ingeschakeld op de server.

    Note

    Bekijk de levenscyclus van sqlClient-stuurprogrammaondersteuning voor de lijst met ondersteunde SQL Server-versies met verschillende versies.Microsoft.Data.SqlClient

    Onveilige oplossing: Configureer TLS/SSL-instellingen in de docker-installatiekopieën/clientomgeving om verbinding te maken met TLS 1.0.

    MinProtocol = TLSv1
    CipherString = DEFAULT@SECLEVEL=1
    

    Note

    Wanneer u verbinding maakt met Microsoft.Data.SqlClient v2.0+ vanuit een Windows-/Linux-omgeving met TLS 1.0 of TLS 1.1, wordt er een beveiligingswaarschuwing weergegeven als de doel-SQL Server en client niet kunnen onderhandelen over minimaal TLS-versie 1.2 bij het tot stand brengen van de verbinding:

    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.

  • Door SQL Server afgedwongen versleuteling

    Als de doelserver een Azure SQL-exemplaar of een on-premises SQL Server is waarvoor de eigenschap Versleuteling afdwingen is ingeschakeld, wordt er een versleutelde verbinding gemaakt, waarvoor de client een vertrouwensrelatie met de server tot stand moet brengen.

    Aanbevolen oplossing: Er zijn twee beschikbare opties om dit probleem op te lossen:

    • Installeer het TLS-certificaat van de doel-SQL Server in de clientomgeving. Deze wordt gevalideerd als versleuteling nodig is.
    • (Minder veilig) Stel de eigenschap TrustServerCertificate=true in de verbindingsreeks in.

    Onveilige oplossing: Schakel de instelling Versleuteling afdwingen in SQL Server uit.

  • TLS-certificaten die niet zijn ondertekend met SHA-256 of hoger.

    Aanbevolen oplossing: Genereer een nieuw TLS-certificaat voor de server waarvan de hash is ondertekend met ten minste het HASH-algoritme SHA-256.

  • Strikt beperkte coderingssuites op Linux met .NET 5+

    .NET 5 heeft een belangrijke wijziging geïntroduceerd voor Linux-clients, waarbij standaard een strikt beperkte lijst met toegestane coderingssuites wordt gebruikt. Mogelijk moet u de standaardlijst met coderingssuites uitbreiden om verouderde clients te accepteren (of om contact op te nemen met verouderde servers) door een CipherSuitePolicy waarde op te geven of het OpenSSL-configuratiebestand te wijzigen.

    Lees meer over standaard TLS-coderingssuites voor .NET in Linux voor aanbevolen actie.

    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.
    
  • Door SQL Server afgedwongen versleuteling

    Als de doelserver een on-premises SQL Server is met de eigenschap Geforceerde versleuteling ingeschakeld en een zelfondertekend certificaat, wordt er een versleutelde verbinding gemaakt, waarvoor de client een vertrouwensrelatie met de server tot stand moet brengen.

    Aanbevolen oplossing: Er zijn twee beschikbare opties om dit probleem op te lossen:

    • Installeer het TLS-certificaat van de doel-SQL Server in de clientomgeving. Deze wordt gevalideerd als versleuteling nodig is.
    • (Minder veilig) Stel de eigenschap TrustServerCertificate=true in de verbindingsreeks in.

    Onveilige oplossing: Schakel de instelling Versleuteling afdwingen in SQL Server uit.

Uitputtingsfouten van verbindingsgroep

Waargenomen stacktracering:

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.

Mogelijke redenen en oplossingen

Clienttoepassing opent meer verbindingen dan de verbindingsgroep op een bepaald moment actief kan zijn.

Aanbevolen oplossing: Configureer de verbindingseigenschap Maximale poolgrootte met een hogere waarde en sluit ongebruikte verbindingen tijdig.

Contact Support

Als deze handleiding uw verbindingsproblemen niet oplost, kunt u bestaande problemen in de dotnet-/sqlclient-opslagplaats bekijken en indien nodig een nieuw probleem openen.