Aracılığıyla paylaş


SqlClient sorun giderme kılavuzu

ADO.NET'i indir

SQL Server'a bağlanırken özel durumlar

Bağlantı kurulamamasının çeşitli nedenleri vardır. Sorunların çoğunu analiz etmek ve çözmek için kılavuz olarak kullanılabilecek bazı sorun giderme ipuçlarını burada bulabilirsiniz.

Yerel SNI (Sunucu Ağ Arabirimi) kitaplığı yüklenemiyor

.NET Framework uygulamalarında sorunlar

Stacktrace gözlemlendi:

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, SqlClient'ın Windows üzerinde çalışırken çeşitli ağ işlemleri için bağımlı olduğu yerel C++ kitaplığıdır. MSBuild Proje SDK'sı ile oluşturulan .NET Framework uygulamalarında, yerel DLL'ler geri yükleme komutları ile yönetilmiyor. Bu nedenle NuGet paketine .targets gerekli "Kopyala" işlemlerini tanımlayan bir Microsoft.Data.SqlClient.SNI dosya eklenir.

Kitaplığa doğrudan bağımlılık yapıldığında .targets eklenen Microsoft.Data.SqlClient dosya otomatik olarak başvurulur. Geçişli (dolaylı) başvuru yapılan senaryolarda, gerektiğinde "Kopyala" işlemlerinin yürütülebilmesi için bu .targets dosyaya el ile başvurulmalıdır.

Önerilen Çözüm: "Kopyala" işlemlerinin .targets yürütülmesini sağlamak için dosyanın uygulamanın proje dosyasında başvuruldığından emin olun. Proje dosyasında yapılan düzenlemelere bir örnek bu ilgili GitHub sorununda bulunabilir.

Bu hedefler Yalnızca Microsoft'un bilinen ve yaygın olarak kullanılan hedeflerini kapsar. Dış bir araç veya uygulama ikili dosyaları kopyalamak için özel hedefler tanımlıyorsa, yerel SNI DLL'lerinin ikili dosyalar ile birlikte kopyalandığından ve istemci uygulamaları yürütülürken kullanılabilir olduğundan emin olmak için yeni hedeflerin Microsoft.Data.SqlClient.dll araç bakımcıları tarafından tanımlanması gerekir.

.NET Core uygulamalarında sorunlar

Stacktrace gözlemlendi:

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

Bu hata yalnızca Windows uygulamalarında oluşabilir. Unix ortamında oluşursa, uygulamanızın Windows için değil, uygun bir Unix çalışma zamanını hedeflemek için oluşturulduğuna emin olmanız gerekir.

SNI, SqlClient'ın Windows üzerinde çalışırken çeşitli ağ işlemleri için bağımlı olduğu yerel C++ kitaplığıdır. Microsoft.Data.SqlClient .NET Core'da bu kitaplığın yüklenmesini/kaldırılmasını yönetmez.

Önerilen Çözüm: .NET Core işleminde yerel çalışma zamanı kitaplıklarının yüklendiği dosya sisteminde "Yürüt" izinlerinin verildiğinden emin olun. Bu işlem sorunu çözmezse, daha fazla destek için dotnet/runtime deposunda bir sorun oluşturabilirsiniz.

Yerel SNI (pdb bulunamadı) hataları

Stacktrace gözlemlendi:

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'

Önerilen Çözüm: İstemci uygulamasının Microsoft.Data.SqlClient paketinin en düşük v2.1.0 sürümüne başvurdığından emin olun. EF Core kullanırken bağımlılığı geçersiz kılmak için doğrudan bu paketin sürümüne referans ekleyin Microsoft.Data.SqlClient.

Ana bilgisayar adı çözümleme hataları

Stacktrace gözlemlendi:

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

Olası nedenler

  • SQL Server'da TCP/Adlandırılmış Kanallar Protokolü etkinleştirilmedi

    Önerilen Çözüm: SQL Server Configuration Manager konsolundan SQL Server örneğinde TCP/Adlandırılmış Kanallar Protokolünü etkinleştirin.

  • Ana bilgisayar adı bilinmiyor

    Önerilen Çözüm: Ana bilgisayar adının, bağlantının başlatıldığı istemciden Sunucunun IP adresine çözümlendiğinden emin olun.

Oturum açma aşaması hataları

Stacktraces gözlemlendi:

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)

Olası nedenler ve çözümler

  • SQL Server TLS 1.2'i desteklemiyor

    Bu hata genellikle docker görüntü kapsayıcıları, Unix istemcileri veya TLS 1.2'nin desteklenen en düşük TLS protokolü olduğu Windows istemcileri gibi istemci ortamlarında oluşur.

    Önerilen Çözüm: Desteklenen SQL Server sürümlerine en son güncelleştirmeleri yükleyin ve sunucuda TLS 1.2 protokolünün etkinleştirildiğinden emin olun.

    Note

    Desteklenen SQL Server sürümleri listesini, farklı sürümlerine sahip SqlClient sürücü destek süreci için görüntüleyin.

    Güvenli olmayan çözüm: TLS 1.0'a bağlanmak için docker görüntüsü/istemci ortamında TLS/SSL ayarlarını yapılandırın.

    MinProtocol = TLSv1
    CipherString = DEFAULT@SECLEVEL=1
    

    Note

    WINDOWS/Linux ortamından TLS 1.0 veya TLS 1.1 ile v2.0+ ile bağlanırken Microsoft.Data.SqlClient , bağlantı kurulurken hedef SQL Server ve istemci en az TLS sürüm 1.2 ile anlaşma yapamazsa bir güvenlik uyarısı iletisi oluşturulur:

    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.

  • SQL Server zorunlu şifreleme

    Hedef Sunucu bir Azure SQL örneği veya "Şifrelemeye Zorla" özelliği açık bir şirket içi SQL Server ise, istemcinin sunucuyla güven kurması gereken şifreli bir bağlantı yapılır.

    Önerilen Çözüm: Bu sorunu çözmek için iki seçenek vardır:

    • hedef SQL Server'ın TLS sertifikasını istemci ortamına yükleyin. Şifreleme gerekip gerekmediğini doğrular.
    • (Daha az güvenli) Bağlantı dizesinde "TrustServerCertificate=true" özelliğini ayarlayın.

    Güvenli olmayan çözüm: SQL Server'da "Şifrelemeyi Zorla" ayarını devre dışı bırakın.

  • TLS sertifikaları SHA-256 veya üzeri ile imzalanmaz.

    Önerilen Çözüm: Karma değeri en azından SHA-256 karma algoritmasıyla imzalanan sunucu için yeni bir TLS sertifikası oluşturun.

  • .NET 5+ ile Linux'ta sıkı şekilde kısıtlanmış şifreleme paketleri

    .NET 5, izin verilen şifreleme paketlerinin sıkı bir listesinin varsayılan olarak kullanıldığı Linux istemcileri için önemli bir değişiklik getirdi. Bir değer belirterek CipherSuitePolicy veya OpenSSL yapılandırma dosyasını değiştirerek eski istemcileri kabul etmek (veya eski sunuculara başvurmak için) varsayılan şifreleme paketi listesini genişletmeniz gerekebilir.

    Önerilen eylem için Linux üzerinde .NET için varsayılan TLS şifreleme paketleri hakkında daha fazla bilgi edinin.

    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.
    
  • SQL Server zorunlu şifreleme

    Hedef Sunucu, "Şifrelemeye Zorla" özelliği açık ve kendinden imzalı bir sertifikaya sahip bir yerel SQL Server ise, istemci sunucuyla güven ilişkisi kurarak şifreli bir bağlantı yapar.

    Önerilen Çözüm: Bu sorunu çözmek için iki seçenek vardır:

    • hedef SQL Server'ın TLS sertifikasını istemci ortamına yükleyin. Şifreleme gerekip gerekmediğini doğrular.
    • (Daha az güvenli) Bağlantı dizesinde "TrustServerCertificate=true" özelliğini ayarlayın.

    Güvenli olmayan çözüm: SQL Server'da "Şifrelemeyi Zorla" ayarını devre dışı bırakın.

Bağlantı Havuzu tükenme hataları

Yığın izi gözlendi.

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.

Olası nedenler ve çözümler

İstemci uygulaması, bağlantı havuzunun belirli bir anda etkin tutabileceğinden daha fazla bağlantı açıyor.

Önerilen Çözüm: "En Büyük Havuz Boyutu" bağlantı özelliğini daha yüksek bir değere yapılandırın ve kullanılmayan bağlantıları zamanında kapatın.

Desteğe Başvurma

Bu kılavuz bağlantı sorunlarınızı çözmezse dotnet/sqlclient deposundaki mevcut sorunları görüntüleyebilir ve gerekirse yeni bir sorun açabilirsiniz.