Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of mappen te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen om mappen te wijzigen.
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 waargenomen:
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 gerefereerd wanneer er een directe afhankelijkheid van de Microsoft.Data.SqlClient-bibliotheek wordt gemaakt. In scenario's waarin een transitieve (indirecte) verwijzing wordt gemaakt, moet dit .targets bestand handmatig worden opgegeven zodat kopieerbewerkingen indien 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 waargenomen:
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 waargenomen:
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, moet u rechtstreeks een verwijzing toevoegen naar deze specifieke pakketversie van Microsoft.Data.SqlClient om de afhankelijkheid te overschrijven.
Fouten bij het oplossen van hostnamen
Stacktrace waargenomen:
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
Mogelijke redenen
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.
Lange verbindingsvertragingen met pre-login handshake-timeout
Waargenomen stacktrace:
Microsoft.Data.SqlClient.SqlException (0x80131904): Connection Timeout Expired. The timeout period elapsed while attempting to consume the pre-login handshake acknowledgement. This could be because the pre-login handshake failed or the server was unable to respond back in time.
Mogelijke redenen en oplossingen
Op .NET Framework TransparentNetworkIPResolution=True is dat de standaard. Wanneer de doel-DNS-naam naar meerdere IP's wordt omgezet en een eerder IP ongezond, verouderd of onbereikbaar is, probeert de driver de opgeloste IP's achtereenvolgens en verhoogt hij de time-out per poging elke ronde totdat de totale Connect Timeout limiet is bereikt. De lange verbindingsvertraging verschijnt als een pre-login handshake timeout.
Veelvoorkomende topologieën waarbij dit probleem voorkomt zijn onder andere:
- Azure SQL Database, Azure SQL Managed Instance, of SQL database in Microsoft Fabric.
- On-premises SQL Server achter een Always On beschikbaarheidsgroep-luisteraar waarvan de DNS-naam naar meerdere replica-IP's wordt omgezet.
- Failover-clusterinstanties met een multi-subnet cluster luisteraar, of een ander doelwit waarvan de DNS-naam meerdere
AofAAAArecords bevat.
Aanbevolen oplossing: Zet MultiSubnetFailover=True de verbindingsreeks in. Deze instelling selecteert een parallel-connect codepad dat authenticatie voltooit met de eerste responsieve replica en op .NET Framework de sequentiële per-IP herpogingsloop omzeilt. Deze aanbeveling werkt op elke .NET-versie. Voor meer informatie, zie Transparante IP-resolutie van het netwerk uitschakelen.
Aanmeldingsfasefouten
Waargenomen stacktraces:
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-driverondersteuning voor de lijst met ondersteunde SQL Server-versies met verschillende versies van
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=1Note
Wanneer u verbinding maakt met
Microsoft.Data.SqlClientv2.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 encryptiesuites 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
CipherSuitePolicywaarde 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 stacktrace:
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 connectiepool actief kan houden.
Aanbevolen oplossing: Configureer de verbindingseigenschap Maximale poolgrootte met een hogere waarde en sluit ongebruikte verbindingen tijdig.
Contacteer ondersteuning
Als deze handleiding uw verbindingsproblemen niet oplost, kunt u bestaande problemen in de dotnet-/sqlclient-opslagplaats bekijken en indien nodig een nieuw probleem openen.