Sdílet prostřednictvím


Průvodce odstraňováním potíží s SqlClient

Stáhnout ADO.NET

Výjimky při připojování k SQL Serveru

Existují různé důvody, proč se nepodaří navázat připojení. Tady je několik tipů pro řešení potíží, které můžete použít jako vodítko k analýze a řešení mnoha problémů.

Nelze načíst nativní knihovnu SNI (Server Network Interface)

Problémy v aplikacích .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 je nativní knihovna C++, na které SqlClient závisí na různých síťových operacích při spuštění ve Windows. V aplikacích .NET Framework vytvořených pomocí sady MSBuild Project SDK se nativní knihovny DLL nespravují pomocí příkazů pro obnovení. .targets Soubor je tedy součástí Microsoft.Data.SqlClient.SNI balíčku NuGet, který definuje nezbytné operace kopírování.

Zahrnutý .targets soubor se automaticky odvozuje, když se do Microsoft.Data.SqlClient knihovny vytvoří přímá závislost. Ve scénářích, kde se provádí tranzitivní (nepřímý) odkaz, by měl být tento .targets soubor ručně odkazován, aby se zajistilo, že operace kopírování mohou být v případě potřeby provedeny.

Doporučené řešení: Ujistěte se, že se na .targets soubor projektu aplikace odkazuje, aby se zajistilo, že se spustí operace kopírování. Příklad úprav souboru projektu najdete v tomto souvisejícím problému s GitHubem.

Tyto cíle pokrývají pouze známé a běžně používané cíle Microsoftu. Pokud externí nástroj nebo aplikace definuje vlastní cíle pro kopírování binárních souborů, musí být nové cíle definovány správci nástrojů, aby se zajistilo, že se nativní knihovny DLL SNI zkopírují spolu s binárními Microsoft.Data.SqlClient.dll soubory a jsou dostupné při spouštění klientských aplikací.

Problémy v aplikacích .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

K této chybě může dojít pouze v aplikacích pro Windows. Pokud k ní dojde v prostředí Unix, musíte zajistit, aby byla vaše aplikace vytvořená tak, aby správně cílila na modul runtime unixu, a ne pro Windows.

SNI je nativní knihovna C++, na které SqlClient závisí na různých síťových operacích při spuštění ve Windows. Microsoft.Data.SqlClient nespravuje načítání a uvolňování této knihovny v .NET Core.

Doporučené řešení: Ujistěte se, že jsou v systému souborů udělená oprávnění Spustit, kde se v procesu .NET Core načítají nativní knihovny modulu runtime. Pokud se tím problém nevyřeší, můžete problém podat v úložišti dotnet/runtime pro další podporu.

Nativní SNI (pdb nenalezena) chyby

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'

Doporučené řešení: Ujistěte se, že klientská aplikace odkazuje na minimální verzi balíčku Microsoft.Data.SqlClient v2.1.0 . Pokud používáte EF Core, přidejte odkaz na tuto verzi Microsoft.Data.SqlClient balíčku přímo pro přepsání závislosti.

Chyby překladu názvů hostitelů

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

  • Protokol TCP/Pojmenované kanály není na SQL Serveru povolený.

    Doporučené řešení: Povolte protokol TCP/Pojmenované kanály v instanci SQL Serveru z konzoly nástroje SQL Server Configuration Manager.

  • Název hostitele není známý

    Doporučené řešení: Ujistěte se, že se název hostitele přeloží na IP adresu serveru z klienta, u kterého probíhá inicializováno připojení.

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)

Možné důvody a řešení

  • SQL Server nepodporuje protokol TLS 1.2

    K této chybě obvykle dochází v klientských prostředích, jako jsou kontejnery imagí Dockeru, klienti unixu nebo klienti Windows, kde protokol TLS 1.2 je minimální podporovaný protokol TLS.

    Doporučené řešení: Nainstalujte nejnovější aktualizace na podporované verze SQL Serveru a ujistěte se, že je na serveru povolený protokol TLS 1.2.

    Note

    Zobrazit životní cyklus podpory ovladače SqlClient pro seznam podporovaných verzí SQL Serveru s různými verzemi Microsoft.Data.SqlClient.

    Nezabezpečené řešení: Nakonfigurujte nastavení PROTOKOLU TLS/SSL v imagi nebo klientském prostředí Dockeru pro připojení pomocí protokolu TLS 1.0.

    MinProtocol = TLSv1
    CipherString = DEFAULT@SECLEVEL=1
    

    Note

    Když se připojujete pomocí Microsoft.Data.SqlClient verze 2.0 nebo novější z prostředí Windows/Linux s protokolem TLS 1.0 nebo TLS 1.1, zobrazí se při navazování připojení upozornění zabezpečení, pokud cílový SQL Server a klient nemůže při navazování připojení vyjednat minimálně protokol TLS verze 1.2:

    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.

  • Vynucené šifrování SQL Serveru

    Pokud je cílovým serverem instance Azure SQL nebo místní SQL Server se zapnutou vlastností Vynucení šifrování, vytvoří se šifrované připojení, pro které musí klient navázat vztah důvěryhodnosti se serverem.

    Doporučené řešení: Tento problém můžete vyřešit dvěma způsoby:

    • Nainstalujte do klientského prostředí certifikát TLS cílového SQL Serveru. Ověří se, jestli je potřeba šifrování.
    • (Méně bezpečné) Nastavte vlastnost TrustServerCertificate=true v připojovacím řetězci.

    Nezabezpečené řešení: Zakažte nastavení Vynucení šifrování na SQL Serveru.

  • Certifikáty TLS nejsou podepsané pomocí SHA-256 nebo vyšší.

    Doporučené řešení: Vygenerujte nový certifikát TLS pro server, jehož hodnota hash je podepsána alespoň algoritmem hash SHA-256.

  • Úzce omezené šifrovací sady v Linuxu s .NET 5+

    Platforma .NET 5 zavedla zásadní změnu pro klienty s Linuxem, kde se ve výchozím nastavení používá úzce omezený seznam povolených šifrovacích sad. Možná budete muset rozbalit výchozí seznam šifrovacích sad tak, aby přijímal starší klienty (nebo kontaktoval starší servery) zadáním CipherSuitePolicy hodnoty nebo změnou konfiguračního souboru OpenSSL .

    Další informace o výchozích šifrovacích sadách TLS pro .NET v Linuxu najdete v doporučených akcích.

    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.
    
  • Vynucené šifrování SQL Serveru

    Pokud je cílový server místním SQL Serverem se zapnutou vlastností Vynutit šifrování a certifikát podepsaný svým držitelem, vytvoří se šifrované připojení, pro které musí klient navázat vztah důvěryhodnosti se serverem.

    Doporučené řešení: Tento problém můžete vyřešit dvěma způsoby:

    • Nainstalujte do klientského prostředí certifikát TLS cílového SQL Serveru. Ověří se, jestli je potřeba šifrování.
    • (Méně bezpečné) Nastavte vlastnost TrustServerCertificate=true v připojovacím řetězci.

    Nezabezpečené řešení: Zakažte nastavení Vynucení šifrování na SQL Serveru.

Chyby vyčerpání fondu připojení

Pozorované trasování zásobníku:

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.

Možné důvody a řešení

Klientská aplikace otevírá více připojení, než může fond připojení v daném okamžiku obsahovat aktivní.

Doporučené řešení: Nakonfigurujte vlastnost připojení Max Pool Size (Maximální velikost fondu) na vyšší hodnotu a včas zavřete nepoužívané připojení.

Contact Support

Pokud tato příručka nevyřeší problémy s připojením, můžete zobrazit existující problémy v úložišti dotnet/sqlclient a v případě potřeby otevřít nový problém.