Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Der Microsoft.Data.SqlClient-Namespace ist im Wesentlichen eine neue Version des System.Data.SqlClient-Namespace. Microsoft.Data.SqlClient beibehält in der Regel dieselbe API und Abwärtskompatibilität mit System.Data.SqlClient. Die Migration von System.Data.SqlClient zu Microsoft.Data.SqlClient ist für die meisten Anwendungen einfach. Fügen Sie eine NuGet-Abhängigkeit zu Microsoft.Data.SqlClient hinzu und aktualisieren Sie Verweise und using-Anweisungen auf Microsoft.Data.SqlClient.
Es gibt einige Unterschiede bei weniger verwendeten APIs im Vergleich zu System.Data.SqlClient, die sich auf einige Anwendungen auswirken können. Informationen zu diesen Unterschieden finden Sie im Spickzettel zur Portierung.
API-Verweis
Die Details der Microsoft.Data.SqlClient-API finden Sie im .NET-API-Browser.
Versionshinweise für 7.0
Dies ist die allgemeine Verfügbarkeitsversion von Microsoft.Data.SqlClient 7.0, ein wichtiger Meilenstein für den .NET-Datenanbieter für SQL Server. Diese Version behebt das am meisten hochgewählte Problem in der Geschichte des Repositorys — das Herauslösen von Azure-Abhängigkeiten aus dem Kernpaket — führt anpassbare SSPI-Authentifizierung ein, fügt erweitertes Routing für Azure hinzu und bietet Leistungsverbesserungen beim asynchronen Lesen.
Ebenfalls im Rahmen dieses Meilensteins veröffentlicht:
- Microsoft.Data.SqlClient.Extensions.Abstractions 1.0.0 veröffentlicht. Siehe Versionshinweise.
- Microsoft.Data.SqlClient.Extensions.Azure 1.0.0 veröffentlicht. Siehe Versionshinweise.
- Microsoft.Data.SqlClient.Internal.Logging 1.0.0 veröffentlicht. Siehe Versionshinweise.
- Die Version 7.0.0 von Microsoft.Data.SqlClient.AlwaysEncrypted.AzureKeyVaultProvider wurde veröffentlicht. Siehe Versionshinweise.
Unterbrechen von Änderungen in 7.0
Azure-Abhängigkeiten, die aus dem Kernpaket entfernt wurden
Was hat sich geändert:
- Das Kernpaket
Microsoft.Data.SqlClienthängt nicht mehr vonAzure.Core,Azure.Identityoder deren transitiven Abhängigkeiten (z. B.Microsoft.Identity.Client,Microsoft.Web.WebView2) ab. Azure Active Directory/Entra ID-Authentifizierungsfunktionalität (ActiveDirectoryAuthenticationProviderund verwandte Typen) wurde in ein neuesMicrosoft.Data.SqlClient.Extensions.AzurePaket extrahiert. (#1108, #3680, #3902, #3904, #3908, #3917, #3982, #3978, #3986) - Zwei zusätzliche Pakete werden eingeführt, um diese Trennung zu unterstützen:
Microsoft.Data.SqlClient.Extensions.Abstractions(gemeinsame Typen zwischen dem Kerntreiber und Erweiterungen) undMicrosoft.Data.SqlClient.Internal.Logging(gemeinsam genutzte ETW-Ablaufverfolgungsinfrastruktur).
(#3626, #3628, #3967, #4038)
Wer profitiert:
- Alle Benutzer profitieren von einem deutlich leichteren Kernpaket. Zuvor wurde die Azure-Abhängigkeitskette in zahlreichen Assemblys abgerufen, auch für Anwendungen, die nur grundlegende SQL Server-Konnektivität benötigten. Dies war das meistbewertete offene Problem im Repository.
- Benutzer, die die Entra-ID-Authentifizierung nicht mehr verwenden, enthalten keine Azure-bezogenen Assemblys mehr in ihrer Buildausgabe.
- Benutzer, die entra ID-Authentifizierung verwenden, können jetzt Azure-Abhängigkeitsversionen unabhängig vom Kerntreiber verwalten.
Auswirkungen:
- Anwendungen mit entra ID-Authentifizierung (z. B.
ActiveDirectoryInteractive, ,ActiveDirectoryDefault,ActiveDirectoryManagedIdentityusw.) müssen jetzt dasMicrosoft.Data.SqlClient.Extensions.AzureNuGet-Paket separat installieren:
dotnet add package Microsoft.Data.SqlClient.Extensions.Azure
- Es sind keine Codeänderungen erforderlich, die über das Hinzufügen des Paketverweises hinausgehen.
- Wenn eine Entra-ID-Authentifizierungsmethode verwendet wird, ohne dass das Azure-Paket installiert ist, stellt der Treiber jetzt eine Fehlermeldung mit Aktionen bereit, die Benutzer zum Installieren des richtigen Pakets führt.
Weitere Bruchänderungen in 7.0
- Die öffentliche Sichtbarkeit der internen Interoperabilitätsenums (
IoControlCodeAccessundIoControlTransferType) wurde zurückgesetzt, nachdem sie während der Projektzusammenführung versehentlich öffentlich gemacht worden war. (#3900)
Neue Features in 7.0
Erweiterbare Authentifizierung mit SspiContextProvider
Was hat sich geändert:
- Es wurde eine öffentliche
SspiContextProviderEigenschaft zuSqlConnectionhinzugefügt, um die in 6.1.0 begonnenen SSPI-Erweiterbarkeitsarbeiten abzuschließen. Anwendungen können jetzt einen benutzerdefinierten SSPI-Kontextanbieter für die integrierte Authentifizierung bereitstellen, wodurch benutzerdefinierte Kerberos-Ticketverhandlungs- und NTLM-Authentifizierungsszenarien für Benutzernamen/Kennwort aktiviert werden. (#2253, #2494)
Wer profitiert:
- Benutzer, die sich über nicht vertrauenswürdige Domänen, nicht domänenverbundene Computer oder plattformübergreifende Umgebungen authentifizieren, in denen die integrierte Authentifizierung schwierig ist.
- Benutzer, die in Containerumgebungen arbeiten und eine manuelle Kerberos-Aushandlung benötigen, ohne Sidecars oder externe Ticket-Aktualisierungsmechanismen bereitzustellen.
- Benutzer, die die NTLM-Benutzernamen-/Kennwortauthentifizierung für SQL Server benötigen, die vom Treiber nicht nativ bereitgestellt werden.
Auswirkungen:
- Anwendungen können eine benutzerdefinierte
SspiContextProvideraufSqlConnectionfestlegen, bevor die Verbindung geöffnet wird.
var connection = new SqlConnection(connectionString);
connection.SspiContextProvider = new MyKerberosProvider();
connection.Open();
- Der Anbieter verarbeitet den Authentifizierungstokenaustausch während der integrierten Authentifizierung. Das vorhandene Authentifizierungsverhalten bleibt unverändert, wenn kein benutzerdefinierter Anbieter festgelegt wird. Eine Beispielimplementierung finden Sie unter SspiContextProvider_CustomProvider.cs .
-
Hinweis: Dies
SspiContextProviderist Teil des Verbindungspoolschlüssels. Stellen Sie sicher, dass die Implementierung eine konsistente Identität pro Ressource zurückgibt.
Asynchrone Leseleistung: Paket-Multiplexing (Vorschau)
Was hat sich geändert:
- Kontinuierliche Verfeinerung des Paket-Multiplexings mit Fehlerbehebungen und Stabilitätsverbesserungen seit 6.1.0 sowie neuen App-Kontextschaltern für die Opt-In-Steuerung. (#3534, #3537, #3605)
Wer profitiert:
- Anwendungen, die große asynchrone Lesevorgänge durchführen (
ExecuteReaderAsyncmit großen Resultsets, Streamingszenarien oder Massendatenabruf).
Auswirkungen:
- Paket-Multiplexing wird hinter zwei Opt-in-Feature-Schaltern bereitgestellt:
AppContext.SetSwitch("Switch.Microsoft.Data.SqlClient.UseCompatibilityAsyncBehaviour", false);
AppContext.SetSwitch("Switch.Microsoft.Data.SqlClient.UseCompatibilityProcessSni", false);
- Durch das Festlegen beider Schalter auf
falsewird der neue asynchrone Verarbeitungspfad aktiviert. Standardmäßig verwendet der Treiber das vorhandene (kompatible) Verhalten.
Erweiterte Routingunterstützung
Was hat sich geändert:
- Unterstützung für erweitertes Routing, ein TDS-Feature, das es dem Server ermöglicht, Verbindungen zu einem bestimmten Server und einer bestimmten Datenbank während der Anmeldung umzuleiten. (#3641, #3969, #3970, #3973)
Wer profitiert:
- Benutzer, die eine Verbindung mit Azure-Umgebungen herstellen, die benannte Lesereplikate und gatewaybasierten Lastenausgleich verwenden.
Auswirkungen:
- Erweitertes Routing wird während der Anmeldung automatisch ausgehandelt, wenn der Server es unterstützt. Es sind keine Anwendungscodeänderungen erforderlich.
Unterstützung für .NET 10
Was hat sich geändert:
- Aktualisierte Pipelines und Testsuiten zum Kompilieren des Treibers mithilfe des .NET 10 SDK. (#3686)
Wer profitiert:
- Entwickler planen, .NET 10 ab dem ersten Tag zu unterstützen.
Auswirkungen:
- SqlClient 7.0 kompiliert und testet mit .NET 10 und stellt die Kompatibilität sicher.
Die streng typisierten Diagnoseereignisse in .NET Framework
Was hat sich geändert:
Aktiviert
SqlClientDiagnosticListenerbezüglichSqlCommandauf .NET Framework, wodurch eine langjährige Beobachtbarkeitslücke geschlossen wurde, in der Diagnoseereignisse zuvor nur auf .NET Core verfügbar gemacht wurden. (#3658)Die 15 stark typisierten Diagnoseereignisklassen im
Microsoft.Data.SqlClient.DiagnosticsNamespace, die ursprünglich für .NET Core in der Version 6.0 eingeführt wurden, wurden im Zuge der Zusammenführung des Codebestands in das .NET Framework integriert. Beide Plattformen verwenden jetzt dasselbe stark typierte Ereignismodell. Die Typen decken Befehls-, Verbindungs- und Transaktionslebenszyklusereignisse ab:-
SqlClientCommandBefore,SqlClientCommandAfterSqlClientCommandError -
SqlClientConnectionOpenBefore,SqlClientConnectionOpenAfterSqlClientConnectionOpenError -
SqlClientConnectionCloseBefore,SqlClientConnectionCloseAfterSqlClientConnectionCloseError -
SqlClientTransactionCommitBefore,SqlClientTransactionCommitAfterSqlClientTransactionCommitError -
SqlClientTransactionRollbackBefore,SqlClientTransactionRollbackAfterSqlClientTransactionRollbackError
(#3493)
-
Wer profitiert:
- .NET Framework-Benutzer, die Ereignisse für
SqlClientDiagnosticListenerObservability, verteilte Ablaufverfolgung oder benutzerdefinierte Telemetrie abonnieren. Diese Benutzer verfügen jetzt über Parität mit .NET Core, gewinnen IntelliSense, Kompilierungszeitsicherheit und beseitigen die Notwendigkeit, über Spiegelungs- oder Wörterbuch-Nachschlagevorgänge auf Diagnosennutzlasten zuzugreifen.
Auswirkungen:
- In .NET Framework werden
SqlCommandjetzt dieselben Diagnoseereignisse ausgegeben, die zuvor nur auf .NET Core verfügbar waren. Abonnenten vonDiagnosticListenerEreignissen (z. B.Microsoft.Data.SqlClient.WriteCommandBefore) erhalten die stark typierten Objekte:
listener.Subscribe(new Observer<KeyValuePair<string, object?>>(kvp =>
{
if (kvp.Value is SqlClientCommandBefore before)
{
Console.WriteLine($"Executing: {before.Command.CommandText}");
}
}));
- Die Typen implementieren
IReadOnlyList<KeyValuePair<string, object>>, um Abwärtskompatibilität mit Code zu gewährleisten, der Eigenschaften generisch durchläuft.
Weitere Ergänzungen in 7.0
Statische Eigenschaft hinzugefügt
SqlConfigurableRetryFactory.BaselineTransientErrors, die die Standardliste für vorübergehende Fehlercodes als eineReadOnlyCollection<int>verfügbar macht, wodurch es einfacher wird, die Standardliste mit anwendungsspezifischen Fehlercodes zu erweitern. (#3903)App-Kontextumschaltung
Switch.Microsoft.Data.SqlClient.EnableMultiSubnetFailoverByDefaulthinzugefügt, umMultiSubnetFailover=trueglobal festzulegen, ohne Verbindungszeichenfolgen zu ändern. (#3841)App-Kontextwechsel
Switch.Microsoft.Data.SqlClient.IgnoreServerProvidedFailoverPartnerhinzugefügt, damit der Client vom Server bereitgestellte Failover-Partnerinformationen in Basisverfügbarkeitsgruppen ignorieren kann. (#3625)Aktivierte Benutzer-Agent-Feature-Erweiterung (Opt-In über
Switch.Microsoft.Data.SqlClient.EnableUserAgent). (#3606)
Änderungen in 7.0
Einstellung von SqlAuthenticationMethod.ActiveDirectoryPassword
Was hat sich geändert:
-
SqlAuthenticationMethod.ActiveDirectoryPassword(der ROPC-Fluss) ist jetzt markiert[Obsolete]und generiert Compilerwarnungen. Dies entspricht dem Wechsel von Microsoft zur obligatorischen mehrstufigen Authentifizierung. (#3671)
Wer profitiert:
- Teams bewegen sich zu einer stärkeren, kennwortlosen oder MFA-kompatiblen Authentifizierung.
Auswirkungen:
- Wenn Sie
Authentication=Active Directory Passwordverwenden, wechseln Sie zu einer unterstützten Alternative.
| Szenario | Empfohlene Authentifizierung |
|---|---|
| Interaktive /Desktop-Apps | Active Directory Interactive |
| Dienst-zu-Dienst | Active Directory Service Principal |
| Von Azure gehostete Workloads | Active Directory Managed Identity |
| Entwickler-/CI-Umgebungen | Active Directory Default |
- Weitere Informationen finden Sie unter Herstellen einer Verbindung mit Azure SQL mit der Microsoft Entra-Authentifizierung .
7.0 Zielplattform-Unterstützung
- .NET Framework 4.6.2+ (Windows x86, Windows x64, Windows ARM64)
- .NET 8.0+ (Windows x86, Windows x64, Windows ARM, Windows ARM64, Linux, macOS)
Vollständige Versionshinweise, einschließlich Abhängigkeiten, sind im GitHub-Repository verfügbar: 7.0 Versionshinweise.
Versionshinweise für 6.1
Neue Features in 6.1
Unterstützung für dedizierte SQL Server-Vektordatentypen hinzugefügt
Was sich geändert hat:
Optimierte Vektorkommunikation zwischen MDS und SQL Server 2025 (17.x) mit einem benutzerdefinierten Binärformat über das TDS-Protokoll (#3433, #3443).
Reduzierte Verarbeitungslast im Vergleich zur vorhandenen JSON-basierten Vektorunterstützung.
Anfängliche Unterstützung für 32-Bit-Gleitkommavektoren mit einfacher Genauigkeit.
Wer profitiert:
- Anwendungen, die große Vektordatensätze verschieben, sehen eine vorteilhafte Verbesserung der Verarbeitungszeiten und Speicheranforderungen.
- Vektorspezifische APIs sind bereit, zukünftige numerische Darstellungen mit einem konsistenten Look-and-Feel zu unterstützen.
Effekt:
Reduzierte Übertragungs- und Verarbeitungszeiten für Vektorvorgänge im Vergleich zu JSON mit SQL Server 2025 (17.x):
- Lesevorgänge: 50x Verbesserung
- Schreibvorgänge: um das 3,3-fache verbessert
- Massenkopie: 19-fache Verbesserung
- (Beobachtet mit einer Vektorspalte von maximaler Größe 1998 und 10.000 Datensätzen für jede Operation.)
Verbesserter Speicherbedarf durch die Vermeidung der JSON-Serialisierung/Deserialisierung und die Reduzierung von Auswüchsen bei der Zeichenfolgedarstellung.
Aus Gründen der Abwärtskompatibilität mit früheren SQL Server Vector-Implementierungen verwenden Anwendungen möglicherweise weiterhin JSON-Zeichenfolgen zum Senden/Empfangen von Vektordaten, obwohl sie keine der zuvor erwähnten Leistungsverbesserungen sehen.
Wiederbelebung der .NET Standard 2.0-Zielunterstützung
Was sich geändert hat:
- Die Unterstützung für das Targeting von .NET Standard 2.0 ist zurückgekehrt (#3381)
- Der Support wurde zuvor in der 6.0-Version entfernt, wobei die Community Bedenken geäußert hat.
Wer profitiert:
- Bibliotheken, die von MDS abhängig sind, können nahtlos auf eines der folgenden Frameworks ausgerichtet sein:
- .NET-Standard 2.0
- .NET Framework 4.6.2 und höher
- .NET 8.0
- .NET 9.0
- Anwendungen sollten weiterhin auf Laufzeiten abzielen.
- Die MDS .NET Standard 2.0-Zielframeworkunterstützung enthält keine tatsächliche Implementierung und kann nicht mit einer Laufzeit verwendet werden.
- Der Build-/Veröffentlichungsprozess einer Anwendung sollte immer die entsprechende MDS .NET/.NET Framework-Laufzeitimplementierung auswählen.
- Benutzerdefinierte Build-/Veröffentlichungsaktionen, die fälschlicherweise versuchen, die MDS .NET Standard 2.0-Referenz-DLL zur Laufzeit bereitzustellen, werden nicht unterstützt.
Effekt:
Bibliotheken für .NET Standard 2.0 erhalten keine Warnungen mehr, z. B.:
warning NU1701: Package 'Microsoft.Data.SqlClient 6.0.2' was restored using '.NETFramework,Version=v4.6.1, .NETFramework,Version=v4.6.2, .NETFramework,Version=v4.7, .NETFramework,Version=v4.7.1, .NETFramework,Version=v4.7.2, .NETFramework,Version=v4.8, .NETFramework,Version=v4.8.1' instead of the project target framework '.NETStandard,Version=v2.0'. This package may not be fully compatible with your project.
Weitere Ergänzungen
- Unterstützung für Spezialschreibweisen mit Fabric-Endpunkten hinzugefügt. (#3084)
6.1 Zielplattformunterstützung
- .NET Framework 4.6.2+ (Windows Arm64, Windows x86, Windows x64)
- .NET 8.0+ (Windows x86, Windows x64, Windows Arm64, Windows ARM, Linux, macOS)
Vollständige Versionshinweise, einschließlich Abhängigkeiten, sind im GitHub-Repository verfügbar: 6.1 Versionshinweise.
Versionshinweise für 6.0
Breaking Changes in Version 6.0
- Die Unterstützung für .NET Standard wurde aufgehoben. #2386
- Unterstützung für .NET 6 eingestellt #2927
- UWP-Verweise (UAP) gelöscht. #2483
- SQL 2000-Client-seitige Debugunterstützung für das .NET-Framework wurde eingestellt #2981, #2940
Neue Features in 6.0
- Unterstützung für JSON-Datentyp #2916, #2892, #2891, #2880, #2882, #2829, #2830
- Unterstützung für .NET 9 #2946 hinzugefügt
-
Microsoft.Data.SqlClient.Diagnostics.SqlClientDiagnosticTyp in .NET hinzugefügt. #2226 - Unterstützung für
DateOnlyundTimeOnlyinDataTableals strukturierter Parameter hinzugefügt. #2258 - Unterstützung für
SqlConnectionOverridesinOpenAsync()API #2433 hinzugefügt - Lokalisierung in tschechischen, polnischen und türkischen #2987 hinzugefügt
- Das
TokenCredential-Objekt wurde hinzugefügt, um die das Zwischenspeichern von Token inActiveDirectoryAuthenticationProviderzu nutzen. #2380 - Readme-Datei zum NuGet-Paket #2826 hinzugefügt.
- NuGet-Paketüberwachung über NuGet.org-Überwachungsquelle aktiviert #3024
- Fehlendes Codebeispiel für SqlCommand_BeginExecuteReader hinzugefügt #3009
- Bereichsablaufverfolgung für
GenerateSspiClientContextwurde hinzugefügt. #2497, #2725
Unterstützung von JSON-Datentypen
Json-Datentypunterstützung ist jetzt in Microsoft.Data.SqlClient v6.0 verfügbar. In dieser Version wird der SqlJson Typ eingeführt, der als Erweiterung für System.Data.SqlDbTypesverfügbar ist:
using System;
using System.Data.SqlTypes;
using System.Text.Json;
namespace Microsoft.Data.SqlTypes
{
/// <summary>
/// Represents the Json data type in SQL Server.
/// </summary>
public class SqlJson : INullable
{
/// <summary>
/// Parameterless constructor. Initializes a new instance of the SqlJson class which
/// represents a null JSON value.
/// </summary>
public SqlJson() { }
/// <summary>
/// Takes a <see cref="string"/> as input and initializes a new instance of the SqlJson class.
/// </summary>
/// <param name="jsonString"></param>
public SqlJson(string jsonString) { }
/// <summary>
/// Takes a <see cref="JsonDocument"/> as input and initializes a new instance of the SqlJson class.
/// </summary>
/// <param name="jsonDoc"></param>
public SqlJson(JsonDocument jsonDoc) { }
/// <inheritdoc/>
public bool IsNull => throw null;
/// <summary>
/// Represents a null instance of the <see cref="SqlJson"/> type.
/// </summary>
public static SqlJson Null { get { throw null; } }
/// <summary>
/// Gets the string representation of the JSON content of this <see cref="SqlJson" /> instance.
/// </summary>
public string Value { get ; }
}
}
Der JSON-Datentyp unterstützt Lese-, Schreib-, Streaming- und Massenkopievorgänge.
Einführung in SqlClientDiagnostics
Neue Typen sind im Microsoft.Data.SqlClient.Diagnostics Namespace verfügbar, der eine stark typierte Auflistung von Schlüsselwertpaaren bereitstellt. Diese Typen können erfasst werden, indem Anwendungen zum Erfassen von Diagnoseereignissen verwendet werden, die vom Treiber ausgegeben werden. In dieser Version werden die folgenden Typen eingeführt:
SqlClientCommandBeforeSqlClientCommandAfterSqlClientCommandErrorSqlClientConnectionOpenBeforeSqlClientConnectionOpenAfterSqlClientConnectionOpenErrorSqlClientConnectionCloseBeforeSqlClientConnectionCloseAfterSqlClientConnectionCloseErrorSqlClientTransactionCommitBeforeSqlClientTransactionCommitAfterSqlClientTransactionCommitErrorSqlClientTransactionRollbackBeforeSqlClientTransactionRollbackAfterSqlClientTransactionRollbackError
Unterstützung für Verbindungsüberschreibungen in der OpenAsync()-API hinzugefügt
Das Standardverhalten von SqlConnection.OpenAsync() kann überschrieben werden, um die zehnsekündige Verzögerung und die automatischen Verbindungswiederholungen zu deaktivieren, die durch vorübergehende Fehler ausgelöst werden.
using(SqlConnection sqlConnection = new SqlConnection("Data Source=(local);Integrated Security=true;Initial Catalog=AdventureWorks;"))
{
await sqlConnection.OpenAsync(SqlConnectionOverrides.OpenWithoutRetry, cancellationToken);
}
6.0 Unterstützung der Zielplattform
- .NET Framework 4.6.2+ (Windows x86, Windows x64)
- .NET 8.0+ (Windows x86, Windows x64, Windows Arm64, Windows ARM, Linux, macOS)
Vollständige Versionshinweise, einschließlich Abhängigkeiten, sind im GitHub-Repository verfügbar: 6.0 Versionshinweise.
Versionshinweise für 5.2
Neue Features in Version 5.2
- Unterstützung für
SqlDiagnosticListenerauf .NET Standard hinzugefügt. #1931 - Neue
RowsCopied64-Eigenschaft zuSqlBulkCopyhinzugefügt. #2004Weitere Informationen - Eine neue
AccessTokenCallBack-API wurde zuSqlConnectionhinzugefügt. #1260Weitere Informationen - Unterstützung für die
SuperSocketNetLib-Registrierungsoption "Verschlüsseln" unter .NET unter Windows wurde hinzugefügt. #2047 -
SqlBatch-Unterstützung für .NET 6+ #1825, #2223 hinzugefügt. Weitere Informationen - Unterstützung der Workload-Identitätsauthentifizierung hinzugefügt #2159, #2264
- Lokalisierungs-Unterstützung auf .NET hinzugefügt #2210
- Unterstützung für Georgische Sortierung hinzugefügt #2194
- Unterstützung für Big Endian-Systeme hinzugefügt #2170
- .NET 8-Unterstützung hinzugefügt #2230
- Explizite Version für Haupt-.NET-Versionsabhängigkeiten zu System.Runtime.Caching 8.0.0, System.Configuration.ConfigurationManager 8.0.0 und System.Diagnostics.DiagnosticSource 8.0.0 hinzugefügt #2303
- Die Möglichkeit zum Generieren von Debugsymbolen in einer separaten Paketdatei hinzugefügt #2137
Neue Eigenschaft RowsCopied64 zu SqlBulkCopy hinzugefügt
SqlBulkCopy verfügt über eine neue Eigenschaft RowsCopied64, die long-Werttypen unterstützt.
Das vorhandene SqlBulkCopy.RowsCopied Verhalten ist unverändert. Wenn der Wert int.MaxValue überschreitet, kann RowsCopied eine negative Zahl zurückgeben.
Beispielverwendung:
using (SqlConnection srcConn = new SqlConnection(srcConstr))
using (SqlCommand srcCmd = new SqlCommand("select top 5 * from employees", srcConn))
{
srcConn.Open();
using (DbDataReader reader = srcCmd.ExecuteReader())
{
using (SqlBulkCopy bulkcopy = new SqlBulkCopy(dstConn))
{
bulkcopy.DestinationTableName = dstTable;
SqlBulkCopyColumnMappingCollection ColumnMappings = bulkcopy.ColumnMappings;
ColumnMappings.Add("EmployeeID", "col1");
ColumnMappings.Add("LastName", "col2");
ColumnMappings.Add("FirstName", "col3");
bulkcopy.WriteToServer(reader);
long rowsCopied = bulkcopy.RowsCopied64;
}
}
}
Neue Eigenschaft AccessTokenCallBack zu SqlConnection hinzugefügt
SqlConnection unterstützt TokenCredential-Authentifizierung, indem eine neue AccessTokenCallBack-Eigenschaft als Func<SqlAuthenticationParameters, CancellationToken,Task<SqlAuthenticationToken>>-Stellvertretung eingeführt wird, um ein Verbundauthentifizierungs-Zugriffstoken zurückzugeben.
Beispielverwendung:
using Microsoft.Data.SqlClient;
using Azure.Identity;
const string defaultScopeSuffix = "/.default";
string connectionString = GetConnectionString();
DefaultAzureCredential credential = new();
using SqlConnection connection = new(connectionString);
connection.AccessTokenCallback = async (authParams, cancellationToken) =>
{
string scope = authParams.Resource.EndsWith(defaultScopeSuffix)
? authParams.Resource
: $"{authParams.Resource}{defaultScopeSuffix}";
AccessToken token = await credential.GetTokenAsync(
new TokenRequestContext([scope]),
cancellationToken);
return new SqlAuthenticationToken(token.Token, token.ExpiresOn);
}
connection.Open();
Console.WriteLine("ServerVersion: {0}", connection.ServerVersion);
Console.WriteLine("State: {0}", connection.State);
SqlBatch-API
Beispielverwendung:
using Microsoft.Data.SqlClient;
class Program
{
static void Main()
{
string str = "Data Source=(local);Initial Catalog=Northwind;"
+ "Integrated Security=SSPI;Encrypt=False";
RunBatch(str);
}
static void RunBatch(string connString)
{
using var connection = new SqlConnection(connString);
connection.Open();
var batch = new SqlBatch(connection);
const int count = 10;
const string parameterName = "parameter";
for (int i = 0; i < count; i++)
{
var batchCommand = new SqlBatchCommand($"SELECT @{parameterName} as value");
batchCommand.Parameters.Add(new SqlParameter(parameterName, i));
batch.BatchCommands.Add(batchCommand);
}
// Optionally Prepare
batch.Prepare();
var results = new List<int>(count);
using (SqlDataReader reader = batch.ExecuteReader())
{
do
{
while (reader.Read())
{
results.Add(reader.GetFieldValue<int>(0));
}
} while (reader.NextResult());
}
Console.WriteLine(string.Join(", ", results));
}
}
5.2 Unterstützung der Zielplattform
- .NET Framework 4.6.2+ (Windows x86, Windows x64)
- .NET 6.0+ (Windows x86, Windows x64, Windows Arm64, Windows ARM, Linux, macOS)
- .NET Standard 2.0+ (Windows x86, Windows x64, Windows Arm64, Windows ARM, Linux, macOS)
Vollständige Versionshinweise, einschließlich Abhängigkeiten, stehen im GitHub-Repository in den Anmerkungen zu Version 5.2 zur Verfügung.
Versionshinweise für 5.1
Änderungen mit möglichen Kompatibilitätsproblemen in 5.1
Neue Features in Version 5.1
- Die Unterstützung für
DateOnlyundTimeOnlywurde für denSqlParameter-Wert undGetFieldValuehinzugefügt. 1813 - Unterstützung für TLS 1.3 wurde für .NET Core und SNI Native hinzugefügt. 1821
- Die
ServerCertificateEinstellung wurde fürEncrypt=MandatoryoderEncrypt=Stricthinzugefügt. #1822Weitere Informationen - Unterstützung von Windows Arm64-Bereitstellungen für .NET Framework wurde hinzugefügt. 1828
Serverzertifikat
Der Standardwert der ServerCertificate-Verbindungseinstellung ist eine leere Zeichenfolge. Wenn Encrypt auf Mandatory oder Strict festgelegt ist, kann ServerCertificate verwendet werden, um einen Pfad im Dateisystem zu einer Zertifikatdatei anzugeben, die mit dem TLS-/SSL-Zertifikat des Servers abgeglichen werden soll. Das angegebene Zertifikat muss exakt übereinstimmen, um gültig zu sein. Die akzeptierten Zertifikatformate sind PEM, DER und CER. Im Folgenden finden Sie ein Beispiel zur Verwendung:
"Data Source=...;Encrypt=Strict;ServerCertificate=C:\\certificates\\server.cer"
5.1: Unterstützung der Zielplattform
- .NET Framework 4.6.2+ (Windows x86, Windows x64)
- .NET 6.0+ (Windows x86, Windows x64, Windows Arm64, Azure Resource Manager, Linux, macOS)
- .NET Standard 2.0+ (Windows x86, Windows x64, Windows Arm64, Windows ARM, Linux, macOS)
Die vollständigen Versionshinweise, einschließlich der Abhängigkeiten, stehen im GitHub-Repository Hinweise zu Version 5.1 zur Verfügung.
Versionshinweise für 5.0
Kompatibilitätsbrechende Änderungen in Version 5.0
- Unterstützung für .NET Framework 4.6.1 wurde entfernt. #1574
- Es wurde eine Abhängigkeit vom Paket Microsoft.SqlServer.Server hinzugefügt. Diese neue Abhängigkeit kann Namespacekonflikte verursachen, wenn Ihre Anwendung auf diesen Namespace verweist und weiterhin Paketverweise (direkt oder indirekt) auf System.Data.SqlClient von .NET Core verfügt.
- Klassen aus dem Namespace
Microsoft.Data.SqlClient.Serverwurden verworfen und durch unterstützte Typen aus dem Paket Microsoft.SqlServer.Server-Paket ersetzt. #1585. Die betroffenen Klassen und Enumerationen sind:- Microsoft.Data.SqlClient.Server.IBinarySerialize -> Microsoft.SqlServer.Server.IBinarySerialize
- Microsoft.Data.SqlClient.Server.InvalidUdtException -> Microsoft.SqlServer.Server.InvalidUdtException
- Microsoft.Data.SqlClient.Server.SqlFacetAttribute -> Microsoft.SqlServer.Server.SqlFacetAttribute
- Microsoft.Data.SqlClient.Server.SqlFunctionAttribute -> Microsoft.SqlServer.Server.SqlFunctionAttribute
- Microsoft.Data.SqlClient.Server.SqlMethodAttribute -> Microsoft.SqlServer.Server.SqlMethodAttribute
- Microsoft.Data.SqlClient.Server.SqlUserDefinedAggregateAttribute -> Microsoft.SqlServer.Server.SqlUserDefinedAggregateAttribute
- Microsoft.Data.SqlClient.Server.SqlUserDefinedTypeAttribute -> Microsoft.SqlServer.Server.SqlUserDefinedTypeAttribute
- (Enumeration:) Microsoft.Data.SqlClient.Server.DataAccessKind -> Microsoft.SqlServer.Server.DataAccessKind
- (enums) Microsoft.Data.SqlClient.Server.Format -> Microsoft.SqlServer.Server.Format
- (enum) Microsoft.Data.SqlClient.Server.SystemDataAccessKind -> Microsoft.SqlServer.Server.SystemDataAccessKind
Neue Features in Version 5.0
- Unterstützung für
TDS8hinzugefügt. Um TDS 8 zu verwenden, sollten Sie in der Verbindungszeichenfolge „Encrypt=Strict“ angeben. #1608Weitere Informationen - Unterstützung der Angabe von Server-SPN und Failoverserver-SPN für die Verbindung wurde hinzugefügt. #1607Weitere Informationen
- Die Unterstützung für Aliase beim Anvisieren von .NET Core unter Windows wurde hinzugefügt. #1588Weitere Informationen
- SqlDataSourceEnumerator wurde hinzugefügt. #1430, Weitere Informationen
- Es wurde ein neuer AppContext-Schalterhinzugefügt, um Warnungen zu unsicherem TLS zu unterdrücken. #1457, Weitere Informationen
TDS 8.0 verbesserte Sicherheit
Wenn Sie TDS 8.0 verwenden möchten, geben Sie "Encrypt=Strict" in der Verbindungszeichenfolge an. Im Strict-Modus ist TrustServerCertificate deaktiviert (im Strict-Modus immer als FALSE behandelt). HostNameInCertificate wurde zur Unterstützung bei einigen Szenarien im Strict-Modus hinzugefügt. TDS 8.0 beginnt und setzt die gesamte Serverkommunikation in einer sicheren, verschlüsselten TLS-Verbindung fort.
Neue Werte für „Encrypt“ wurden hinzugefügt, um das Verbindungsverschlüsselungsverhalten klarzustellen.
Encrypt=Mandatory entspricht Encrypt=True und verschlüsselt Verbindungen während der TDS-Verbindungsverhandlung.
Encrypt=Optional entspricht Encrypt=False und verschlüsselt die Verbindung nur, wenn der Server gegenüber dem Client angibt, dass während der TDS-Verbindungsverhandlung Verschlüsselung erforderlich ist.
Weitere Informationen zum Verschlüsseln von Verbindungen mit dem Server finden Sie unter Verschlüsselung und Zertifikatüberprüfung in Microsoft.Data.SqlClient.
In der Verbindungszeichenfolge kann HostNameInCertificate angegeben werden, um bei der Verwendung von Aliasen, wie z. B. DNS-Aliasen, eine verschlüsselte Verbindung mit einem Server herzustellen, dessen Serverzertifikat einen anderen oder alternativen Namen hat als der vom Client zur Identifizierung dieses Servers verwendete Name. Beispielverwendung: HostNameInCertificate=MyDnsAliasName
Server-SPN
Wenn Sie eine Verbindung in einer Umgebung herstellen, die eine eindeutige Domänen-/Gesamtstrukturtopografie aufweist, liegen möglicherweise bestimmte Anforderungen für Server-SPNs vor. Mit den Einstellungen für ServerSPN/Server-SPN und FailoverServerSPN/FailoverServer-SPN in der Verbindungszeichenfolge können die automatisch generierten Server-SPNs überschrieben werden, die bei der integrierten Authentifizierung in einer Domänenumgebung verwendet werden.
Unterstützung für SQL-Aliase
Benutzer*innen können Aliase mithilfe von SQL Server-Konfigurations-Manager konfigurieren. Diese Aliase werden in der Windows-Registrierung gespeichert und werden bereits bei der Ausrichtung auf das .NET Framework unterstützt. Dieses Release bietet Unterstützung für Aliase, wenn .NET oder .NET Core unter Windows als Zielplattform dienen.
Unterstützung für den SQL-Datenquellen-Enumerator
Stellt einen Mechanismus für das Auflisten aller verfügbaren Instanzen von SQL Server im lokalen Netzwerk bereit.
using Microsoft.Data.Sql;
static void Main()
{
// Retrieve the enumerator instance and then the data.
SqlDataSourceEnumerator instance =
SqlDataSourceEnumerator.Instance;
System.Data.DataTable table = instance.GetDataSources();
// Display the contents of the table.
DisplayData(table);
Console.WriteLine("Press any key to continue.");
Console.ReadKey();
}
private static void DisplayData(System.Data.DataTable table)
{
foreach (System.Data.DataRow row in table.Rows)
{
foreach (System.Data.DataColumn col in table.Columns)
{
Console.WriteLine("{0} = {1}", col.ColumnName, row[col]);
}
Console.WriteLine("============================");
}
}
Unterdrücken von Warnungen zu unsicherem TLS
Eine Sicherheitswarnung wird auf der Konsole ausgegeben, wenn für die Verhandlung mit dem Server eine TLS-Version unter 1.2 verwendet wird. Diese Warnung kann bei der SQL-Verbindung mit Encrypt = false unterdrückt werden, indem der folgenden AppContext-Schalter beim Start der Anwendung aktiviert wird:
Switch.Microsoft.Data.SqlClient.SuppressInsecureTLSWarning
Unterstützung der Zielplattform 5.0
- .NET Framework 4.6.2+ (Windows x86, Windows x64)
- .NET Core 3.1+ (Windows x86, Windows x64, Windows Arm64, Windows ARM, Linux, macOS)
- .NET Standard 2.0+ (Windows x86, Windows x64, Windows Arm64, Windows ARM, Linux, macOS)
Vollständige Versionshinweise, einschließlich Abhängigkeiten, stehen im GitHub-Repository in den Anmerkungen zu Version 5.0 zur Verfügung.
Versionshinweise für 4.1
Vollständige Versionshinweise, einschließlich Abhängigkeiten, stehen im GitHub-Repository unter Hinweise zur Version 4.1 zur Verfügung.
Neue Features in Version 4.1
Einführung des Nachweisprotokolls "None"
In der Verbindungszeichenfolge kann ein neues Nachweisprotokoll namens None verwendet werden. Dieses Protokoll ermöglicht es den Benutzer*innen, für VBS-Enclaves auf einen Enclavenachweis zu verzichten. Wenn dieses Protokoll festgelegt ist, ist die URL-Eigenschaft für die Enklavenattestierung optional.
Beispiel für Verbindungszeichenfolge:
//Attestation protocol NONE with no URL
"Data Source = {server}; Initial Catalog = {db}; Column Encryption Setting = Enabled; Attestation Protocol = None;"
4.1 Zielplattformunterstützung
- .NET Framework 4.6.1+ (Windows x86, Windows x64)
- .NET Core 3.1+ (Windows x86, Windows x64, Windows Arm64, Windows ARM, Linux, macOS)
- .NET Standard 2.0+ (Windows x86, Windows x64, Windows Arm64, Windows ARM, Linux, macOS)
Versionshinweise für 4.0
Vollständige Versionshinweise, einschließlich Abhängigkeiten, stehen im GitHub-Repository unter Hinweise zur Version 4.0 zur Verfügung.
Kompatibilitätsbrechende Änderungen in Version 4.0
- Der Standardwert für die
Encrypt-Verbindungszeichenfolgeneigenschaft wurde auftruefestgelegt. #1210Weitere Informationen - Der Treiber löst jetzt
SqlExceptionanstelle vonAggregateExceptionfür Active Directory-Authentifizierungsmodi aus. #1213 - Die veraltete Verbindungseigenschaft
Asynchronous Processingwurde aus dem .NET Framework entfernt. #1148 - Sicherheitsschalter
Configurable Retry Logicentfernt. #1254Weitere Informationen - Die Unterstützung für .NET Core 2.1 wurde entfernt. #1272
- [.NET Framework] Es wird keine Ausnahme ausgelöst, wenn bei Verwendung der
Active Directory Integrated-Authentifizierung eine Benutzer-ID in der Verbindungszeichenfolge angegeben wird. #1359
Neue Features in Version 4.0
Standardwert für Verschlüsselung auf TRUE festgelegt
Der Standardwert der Encrypt-Verbindungseinstellung wurde von false in true geändert. Mit der wachsenden Nutzung von Clouddatenbanken und der Notwendigkeit, diese Verbindungen sicherzustellen, ist es Zeit für diese abwärtskompatibilitätsbrechende Änderung.
Sicherstellen, dass Verbindungen fehlschlagen, wenn Verschlüsselung erforderlich ist
In Szenarien, in denen Clientverschlüsselungsbibliotheken deaktiviert oder nicht verfügbar waren, konnten unverschlüsselte Verbindungen hergestellt werden, obwohl „Encrypt“ auf TRUE festgelegt war oder der Server eine Verschlüsselung verlangte.
App-Kontextwechsel für die Verwendung von Standardprotokollen des Systems
TLS 1.3 wird vom Treiber nicht unterstützt. Daher wurde es standardmäßig aus der Liste der unterstützten Protokolle entfernt. Benutzer*innen können die Verwendung der Clientprotokolle des Betriebssystems wieder erzwingen, indem sie die folgende App-Kontextoption aktivieren:
Switch.Microsoft.Data.SqlClient.UseSystemDefaultSecureProtocols
Aktivieren der optimierten Parameterbindung
Microsoft.Data.SqlClient führt eine neue SqlCommand-API namens EnableOptimizedParameterBinding ein, um die Leistung von Abfragen mit einer großen Anzahl von Parametern zu verbessern. Diese Eigenschaft ist standardmäßig deaktiviert. Wenn dieser Wert auf true festgelegt ist, werden beim Ausführen des Befehls keine Parameternamen an die SQL-Server-Instance gesendet.
public class SqlCommand
{
public bool EnableOptimizedParameterBinding { get; set; }
}
Entfernen des Sicherheitsschalters für konfigurierbare Wiederholungslogik
Die App-Kontextoption „Switch.Microsoft.Data.SqlClient.EnableRetryLogic“ ist nicht mehr erforderlich, um das Feature der konfigurierbaren Wiederholungslogik zu verwenden. Das Feature wird jetzt in der Produktion unterstützt. Das Standardverhalten des Features ist weiterhin eine Nicht-Wiederholungsrichtlinie, die von Clientanwendungen überschrieben werden muss, um Wiederholungen zu ermöglichen.
Unterstützung freigegebener SqlLocalDb-Instanzen
Freigegebene SqlLocalDb-Instanzen werden jetzt bei Verwendung der verwalteten SNI unterstützt.
- Mögliche Szenarien:
-
(localdb)\.(stellt eine Verbindung mit der Standardinstanz von SqlLocalDb her.) (localdb)\<named instance>-
(localdb)\.\<shared instance name>(*neu hinzugefügte Unterstützung)
-
GetFieldValueAsync<T>- und GetFieldValue<T>-Unterstützung für die Typen XmlReader, TextReader und Stream
Die Typen XmlReader, TextReader und Stream werden bei Verwendung von GetFieldValueAsync<T> und GetFieldValue<T> jetzt unterstützt.
Beispielverwendung:
using (SqlConnection connection = new SqlConnection(connectionString))
{
using (SqlCommand command = new SqlCommand(query, connection))
{
connection.Open();
using (SqlDataReader reader = await command.ExecuteReaderAsync())
{
if (await reader.ReadAsync())
{
using (Stream stream = await reader.GetFieldValueAsync<Stream>(1))
{
// Continue to read from stream
}
}
}
}
}
4.0 Unterstützung der Zielplattform
- .NET Framework 4.6.1+ (Windows x86, Windows x64)
- .NET Core 3.1+ (Windows x86, Windows x64, Windows Arm64, Windows ARM, Linux, macOS)
- .NET Standard 2.0+ (Windows x86, Windows x64, Windows Arm64, Windows ARM, Linux, macOS)
Versionshinweise für 3.1
Vollständige Versionshinweise, einschließlich Abhängigkeiten, sind im GitHub-Repository verfügbar: 3.1 Versionshinweise.
Neue Features in 3.1
Das Nachweisprotokoll "None" wurde eingeführt.
Ein neues Attestierungsprotokoll, genannt None, wird in der Verbindungszeichenfolge erlaubt sein. Dieses Protokoll ermöglicht Es Benutzern, den Enklavennachweis für VBS Enklaven zu vergehen. Wenn dieses Protokoll festgelegt ist, ist die URL-Eigenschaft für die Enklavenattestierung optional.
Beispiel für Verbindungszeichenfolge:
//Attestation protocol NONE with no URL
"Data Source = {server}; Initial Catalog = {db}; Column Encryption Setting = Enabled; Attestation Protocol = None;"
Zielplattformunterstützung
- .NET Framework 4.6.1+ (Windows x86, Windows x64)
- .NET Core 3.1+ (Windows x86, Windows x64, Windows ARM64, Windows ARM, Linux, macOS)
- .NET Standard 2.0+ (Windows x86, Windows x64, Windows ARM64, Windows ARM, Linux, macOS)
Versionshinweise für 3.0
Vollständige Versionshinweise, einschließlich Abhängigkeiten, stehen im GitHub-Repository unter Hinweise zur Version 3.0 zur Verfügung.
Bahnbrechende Änderungen in Version 3.0
- Die niedrigste unterstützte Version von .NET Framework ist nun Version 4.6.1. Version 4.6.0 von .NET Framework wird nicht mehr unterstützt. #899
- Für die Verbindungseigenschaft
User Idist jetztClient Idanstelle vonObject Idfür die User-Assigned Managed Identity erforderlich. #1010Weitere Informationen -
SqlDataReadergibt jetzt anstelle eines leerenDBNulleinenbyte[]-Wert zurück. Legacyverhalten kann durch FestlegenAppContextvon Switch.Microsoft.Data.SqlClient.LegacyRowVersionNullBehavior#998 Aktiviert werden. Weitere Informationen.
Neue Features in Version 3.0
Konfigurierbare Wiederholungslogik
Mit diesem neuen Feature wird eine konfigurierbare Unterstützung für Clientanwendungen eingeführt, um bei vorübergehenden oder wiederholbaren Fehlern erneut einen Versuch zu starten. Die Konfiguration kann über Code oder Anwendungskonfigurationsdateien erfolgen, und Wiederholungsvorgänge können angewendet werden, um eine Verbindung zu öffnen oder einen Befehl auszuführen. Dieses Feature ist standardmäßig deaktiviert und befindet sich derzeit in der Vorschauversion. Zum Aktivieren dieser Unterstützung muss für Clientanwendungen die folgende Sicherheitsoption aktiviert werden:
AppContext.SetSwitch("Switch.Microsoft.Data.SqlClient.EnableRetryLogic", true);
Nachdem die .NET AppContext-Option aktiviert wurde, kann mit verschiedenen Anpassungsoptionen für SqlConnection und SqlCommand einzeln oder zusammen eine Richtlinie für die Wiederholungslogik definiert werden.
In SqlConnection und SqlCommand wurden neue öffentliche APIs zum Registrieren einer benutzerdefinierten SqlRetryLogicBaseProvider-Implementierung eingeführt:
public SqlConnection
{
public SqlRetryLogicBaseProvider RetryLogicProvider;
}
public SqlCommand
{
public SqlRetryLogicBaseProvider RetryLogicProvider;
}
Im Folgenden sind Beispiele für die Verwendung der APIs aufgeführt:
using Microsoft.Data.SqlClient;
/// Detecting retriable exceptions is a vital part of the retry pattern.
/// Before applying retry logic it is important to investigate exceptions and choose a retry provider that best fits your scenario.
/// First, log your exceptions and find transient faults.
/// The purpose of this sample is to illustrate how to use this feature and the condition might not be realistic.
class RetryLogicSample
{
private const string DefaultDB = "Northwind";
private const string CnnStringFormat = "Server=localhost; Initial Catalog={0}; Integrated Security=true; pooling=false;";
private const string DropDatabaseFormat = "DROP DATABASE {0}";
// For general use
private static SqlConnection s_generalConnection = new SqlConnection(string.Format(CnnStringFormat, DefaultDB));
static void Main(string[] args)
{
// 1. Define the retry logic parameters
var options = new SqlRetryLogicOption()
{
NumberOfTries = 5,
MaxTimeInterval = TimeSpan.FromSeconds(20),
DeltaTime = TimeSpan.FromSeconds(1)
};
// 2. Create a retry provider
var provider = SqlConfigurableRetryFactory.CreateExponentialRetryProvider(options);
// define the retrying event to report the execution attempts
provider.Retrying += (object s, SqlRetryingEventArgs e) =>
{
int attempts = e.RetryCount + 1;
Console.ForegroundColor = ConsoleColor.Yellow;
Console.WriteLine($"attempt {attempts} - current delay time:{e.Delay} \n");
Console.ForegroundColor = ConsoleColor.DarkGray;
if (e.Exceptions[e.Exceptions.Count - 1] is SqlException ex)
{
Console.WriteLine($"{ex.Number}-{ex.Message}\n");
}
else
{
Console.WriteLine($"{e.Exceptions[e.Exceptions.Count - 1].Message}\n");
}
// It is not a good practice to do time-consuming tasks inside the retrying event which blocks the running task.
// Use parallel programming patterns to mitigate it.
if (e.RetryCount == provider.RetryLogic.NumberOfTries - 1)
{
Console.WriteLine("This is the last chance to execute the command before throwing the exception.");
Console.WriteLine("Press Enter when you're ready:");
Console.ReadLine();
Console.WriteLine("continue ...");
}
};
// Open the general connection.
s_generalConnection.Open();
try
{
// Assume the database is being created and other services are going to connect to it.
RetryConnection(provider);
}
catch
{
// exception is thrown if connecting to the database isn't successful.
throw;
}
}
private static void ExecuteCommand(SqlConnection cn, string command)
{
using var cmd = cn.CreateCommand();
cmd.CommandText = command;
cmd.ExecuteNonQuery();
}
private static void RetryConnection(SqlRetryLogicBaseProvider provider)
{
// Change this if you already have a database with the same name in your database.
string dbName = "Invalid_DB_Open";
// Create a connection to an invalid database.
using var cnn = new SqlConnection(string.Format(CnnStringFormat, dbName));
// 3. Assign the `provider` to the connection
cnn.RetryLogicProvider = provider;
Console.WriteLine($"Connecting to the [{dbName}] ...");
// Manually execute the following command in SSMS to create the invalid database while the SqlConnection is attempting to connect to it.
// >> CREATE DATABASE Invalid_DB_Open;
Console.WriteLine($"Manually, run the 'CREATE DATABASE {dbName};' in the SQL Server before exceeding the {provider.RetryLogic.NumberOfTries} attempts.");
// the connection tries to connect to the database 5 times
Console.WriteLine("The first attempt, before getting into the retry logic.");
cnn.Open();
Console.WriteLine($"Connected to the [{dbName}] successfully.");
cnn.Close();
// Drop it after test
ExecuteCommand(s_generalConnection, string.Format(DropDatabaseFormat, dbName));
Console.WriteLine($"The [{dbName}] is removed.");
}
}
/// Detecting retriable exceptions is a vital part of the retry pattern.
/// Before applying retry logic it is important to investigate exceptions and choose a retry provider that best fits your scenario.
/// First, log your exceptions and find transient faults.
/// The purpose of this sample is to illustrate how to use this feature and the condition might not be realistic.
private const string DefaultDB = "Northwind";
private const string CnnStringFormat = "Server=localhost; Initial Catalog={0}; Integrated Security=true; pooling=false;";
private const string DropDatabaseFormat = "DROP DATABASE {0}";
private const string CreateDatabaseFormat = "CREATE DATABASE {0}";
// For general use
private static SqlConnection s_generalConnection = new SqlConnection(string.Format(CnnStringFormat, DefaultDB));
static void Main(string[] args)
{
// 1. Define the retry logic parameters
var options = new SqlRetryLogicOption()
{
NumberOfTries = 5,
MaxTimeInterval = TimeSpan.FromSeconds(20),
DeltaTime = TimeSpan.FromSeconds(1),
AuthorizedSqlCondition = null,
// error number 3702 : Cannot drop database "xxx" because it is currently in use.
TransientErrors = new int[] {3702}
};
// 2. Create a retry provider
var provider = SqlConfigurableRetryFactory.CreateExponentialRetryProvider(options);
// define the retrying event to report execution attempts
provider.Retrying += (object s, SqlRetryingEventArgs e) =>
{
int attempts = e.RetryCount + 1;
Console.ForegroundColor = ConsoleColor.Yellow;
Console.WriteLine($"attempt {attempts} - current delay time:{e.Delay} \n");
Console.ForegroundColor = ConsoleColor.DarkGray;
if (e.Exceptions[e.Exceptions.Count - 1] is SqlException ex)
{
Console.WriteLine($"{ex.Number}-{ex.Message}\n");
}
else
{
Console.WriteLine($"{e.Exceptions[e.Exceptions.Count - 1].Message}\n");
}
// It is not good practice to do time-consuming tasks inside the retrying event which blocks the running task.
// Use parallel programming patterns to mitigate it.
if (e.RetryCount == provider.RetryLogic.NumberOfTries - 1)
{
Console.WriteLine("This is the last chance to execute the command before throwing the exception.");
Console.WriteLine("Press Enter when you're ready:");
Console.ReadLine();
Console.WriteLine("continue ...");
}
};
// Open a general connection.
s_generalConnection.Open();
try
{
// Assume the database is creating and other services are going to connect to it.
RetryCommand(provider);
}
catch
{
s_generalConnection.Close();
// exception is thrown if connecting to the database isn't successful.
throw;
}
s_generalConnection.Close();
}
private static void ExecuteCommand(SqlConnection cn, string command)
{
using var cmd = cn.CreateCommand();
cmd.CommandText = command;
cmd.ExecuteNonQuery();
}
private static void FindActiveSessions(SqlConnection cnn, string dbName)
{
using var cmd = cnn.CreateCommand();
cmd.CommandText = "DECLARE @query NVARCHAR(max) = '';" + Environment.NewLine +
$"SELECT @query = @query + 'KILL ' + CAST(spid as varchar(50)) + ';' FROM sys.sysprocesses WHERE dbid = DB_ID('{dbName}')" + Environment.NewLine +
"SELECT @query AS Active_sessions;";
var reader = cmd.ExecuteReader();
if (reader.Read())
{
Console.ForegroundColor = ConsoleColor.Green;
Console.Write($">> Execute the '{reader.GetString(0)}' command in SQL Server to unblock the running task.");
Console.ResetColor();
}
reader.Close();
}
var RetryLogicOption = new SqlRetryLogicOption()
{
NumberOfTries = 5,
// Declare the error number 102 as a transient error to apply the retry logic when it occurs.
TransientErrors = new int[] { 102 },
// When a SqlCommand executes out of a transaction,
// the retry logic will apply if it contains a 'select' keyword.
AuthorizedSqlCondition = x => string.IsNullOrEmpty(x)
|| Regex.IsMatch(x, @"\b(SELECT)\b", RegexOptions.IgnoreCase),
DeltaTime = TimeSpan.FromSeconds(1),
MaxTimeInterval = TimeSpan.FromSeconds(60),
MinTimeInterval = TimeSpan.FromSeconds(3)
};
Zudem wurden neue Konfigurationsabschnitte eingeführt, die dieselbe Registrierung über Konfigurationsdateien ermöglichen, ohne vorhandenen Code ändern zu müssen:
<section name="SqlConfigurableRetryLogicConnection"
type="Microsoft.Data.SqlClient.SqlConfigurableRetryConnectionSection, Microsoft.Data.SqlClient"/>
<section name="SqlConfigurableRetryLogicCommand"
type="Microsoft.Data.SqlClient.SqlConfigurableRetryCommandSection, Microsoft.Data.SqlClient"/>
Im Folgenden finden Sie ein einfaches Beispiel für die Verwendung der neuen Konfigurationsabschnitte in Konfigurationsdateien:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="SqlConfigurableRetryLogicConnection"
type="Microsoft.Data.SqlClient.SqlConfigurableRetryConnectionSection, Microsoft.Data.SqlClient"/>
<section name="SqlConfigurableRetryLogicCommand"
type="Microsoft.Data.SqlClient.SqlConfigurableRetryCommandSection, Microsoft.Data.SqlClient"/>
<section name="AppContextSwitchOverrides"
type="Microsoft.Data.SqlClient.AppContextSwitchOverridesSection, Microsoft.Data.SqlClient"/>
</configSections>
<!--Enable safety switch in .NET Core-->
<AppContextSwitchOverrides value="Switch.Microsoft.Data.SqlClient.EnableRetryLogic=true"/>
<!--Retry method for SqlConnection-->
<SqlConfigurableRetryLogicConnection retryMethod ="CreateFixedRetryProvider" numberOfTries ="3" deltaTime ="00:00:10" maxTime ="00:00:30"
transientErrors="40615" />
<!--Retry method for SqlCommand containing SELECT queries-->
<SqlConfigurableRetryLogicCommand retryMethod ="CreateIncrementalRetryProvider" numberOfTries ="5" deltaTime ="00:00:10" maxTime ="00:01:10"
authorizedSqlCondition="\b(SELECT)\b" transientErrors="102, 4060, 0"/>
</configuration>
Alternativ können Anwendungen einen eigenen Anbieter der Basisklasse SqlRetryLogicBaseProvider implementieren und bei SqlConnection/SqlCommand registrieren.
Ereignisindikatoren
Für Anwendungen für NET Core ab Version 3.1 und .NET Standard ab Version 2.1 sind nun die folgenden Zähler verfügbar:
| Name | Anzeigename | BESCHREIBUNG |
|---|---|---|
| active-hard-connections | Tatsächliche aktive Verbindungen, die derzeit mit Servern bestehen | Anzahl der Verbindungen, die derzeit für Datenbankserver geöffnet sind. |
| fest verbundene | Tatsächliche Rate der Verbindungen mit Servern | Anzahl der geöffneten Verbindungen mit Datenbankservern pro Sekunde. |
| physische Trennungen | Tatsächliche Abbruchrate von Serververbindungen | Die Anzahl der pro Sekunde zu Datenbankservern hergestellten Trennungen. |
| aktive-Soft-Verbindungen | Aus dem Verbindungspool abgerufene aktive Verbindungen | Anzahl der bereits geöffneten Verbindungen, die über den Verbindungspool genutzt werden. |
| soft-connects | Rate der aus dem Verbindungspool abgerufenen Verbindungen | Anzahl der über den Verbindungspool genutzten Verbindungen pro Sekunde. |
| Soft-Trennungen | Anzahl der Verbindungen, die an den Verbindungspool zurückgegeben werden | Anzahl der an den Verbindungspool zurückgegebenen Verbindungen pro Sekunde. |
| Anzahl-der-nicht-gepoolten-Verbindungen | Anzahl der Verbindungen, für die kein Verbindungspool genutzt wird | Anzahl der aktiven Verbindungen, die nicht in einem Pool zusammengefasst sind. |
| Anzahl der gepoolten Verbindungen | Anzahl der vom Verbindungspool verwalteten Verbindungen | Anzahl der aktiven Verbindungen, die von der Verbindungspoolinfrastruktur verwaltet werden. |
| number-of-active-connection-pool-groups | Anzahl der aktiven eindeutigen Verbindungszeichenfolgen | Anzahl der aktiven, eindeutigen Verbindungspoolgruppen. Dieser Indikator beruht auf der Anzahl eindeutiger Verbindungszeichenfolgen in der Anwendungsdomäne (AppDomain). |
| Anzahl der inaktiven Verbindungspool-Gruppen | Anzahl eindeutiger Verbindungsstrings, die darauf warten, bereinigt zu werden | Anzahl der eindeutigen Verbindungspoolgruppen, die zum Löschen gekennzeichnet sind. Dieser Indikator beruht auf der Anzahl eindeutiger Verbindungszeichenfolgen in der Anwendungsdomäne (AppDomain). |
| Anzahl-der-aktiven-Verbindungspools | Anzahl der aktiven Verbindungspools | Gesamtzahl der Verbindungspools |
| Anzahl der inaktiven Verbindungspools | Anzahl der inaktiven Verbindungspools | Anzahl inaktiver Verbindungspools, die in letzter Zeit keine Aktivitäten zu verzeichnen hatten und auf den Löschvorgang warten. |
| Anzahl der aktiven Verbindungen | Anzahl der aktiven Verbindungen | Anzahl zurzeit verwendeter aktiver Verbindungen. |
| Anzahl-der-kostenlosen-Verbindungen | Anzahl der bereiten Verbindungen im Verbindungspool | Anzahl der offenen Verbindungen, die für die Verwendung in den Verbindungspools verfügbar sind. |
| Anzahl-der-Stasis-Verbindungen | Anzahl der Verbindungen, die derzeit darauf warten, bereit zu sein | Anzahl der Verbindungen, die derzeit auf den Abschluss einer Aktion warten und für die Verwendung durch die Anwendung nicht verfügbar sind. |
| Anzahl-der-wiederhergestellten-Verbindungen | Anzahl der von der GC zurückgewonnenen Verbindungen | Anzahl der Verbindungen, die durch die Garbage Collection zurückgewonnen wurden, wenn Close oder Dispose nicht von der Anwendung aufgerufen wurde.
Hinweis: Das nicht explizite Schließen oder Freigeben von Verbindungen beeinträchtigt die Leistung. |
Diese Zähler können mit den globalen CLI-Tools von .NET Core verwendet werden: dotnet-counters und dotnet-trace in Windows oder Linux und PerfView in Windows, wobei Microsoft.Data.SqlClient.EventSource als Anbietername verwendet wird. Weitere Informationen finden Sie unter Abrufen von Ereigniszählerwerten.
dotnet-counters monitor Microsoft.Data.SqlClient.EventSource -p
PerfView /onlyProviders=*Microsoft.Data.SqlClient.EventSource:EventCounterIntervalSec=1 collect
Einführung in die Azure.Identity-Abhängigkeit
Microsoft.Data.SqlClient hängt nun in Bezug auf das Abrufen von Tokens für die Authentifizierungsmodi „Active Directory mit verwalteter Identität/MSI“ und „Active Directory-Dienstprinzipal“ von der Azure.Identity-Bibliothek ab. Diese Änderung bringt die folgenden Änderungen bei der öffentlichen Oberfläche mit sich:
Änderung unterbrechen
Für die Verbindungseigenschaft „User ID“ muss jetzt bei „Benutzerseitig zugewiesene verwaltete Identität“ anstelle der Objekt-ID die Client-ID angegeben werden.
Öffentliche API
Neue schreibgeschützte öffentliche Eigenschaft:
SqlAuthenticationParameters.ConnectionTimeoutAbhängigkeit
Azure.Identity v1.3.0
Verbesserungen bei der Ereignisprotokollierung in SNI.dll
Die Versionen Microsoft.Data.SqlClient.SNI (Abhängigkeit von .NET Framework) und Microsoft.Data.SqlClient.SNI.runtime (Abhängigkeit von .NET Core/Standard) wurden auf v3.0.0-preview1.21104.2 aktualisiert. Die Ereignisablaufverfolgung in „SNI.dll“ wird nicht mehr über eine Clientanwendung aktiviert. Es reicht aus, eine Sitzung beim Anbieter Microsoft.Data.SqlClient.EventSource über Tools wie xperf oder perfview zu abonnieren. Weitere Informationen finden Sie unter Unterstützung der Ereignisprotokollierung in nativer SNI.
Aktivieren des Nullwertverhaltens für Zeilenversionen
SqlDataReader gibt anstelle eines leeren DBNull einen byte[]-Wert zurück. Wenn Sie das Legacyverhalten aktivieren möchten, aktivieren Sie beim Starten der Anwendung die folgende AppContext-Option: „Switch.Microsoft.Data.SqlClient.LegacyRowVersionNullBehavior“
Unterstützung der Microsoft Entra-Standardauthentifizierung
Hinweis
Während Microsoft Entra-ID der neue Name für Azure Active Directory (Azure AD) ist, bleibt Azure AD in einigen fest kodierten Elementen wie Benutzeroberfläche-Feldern, Verbindungsanbietern, Fehlercodes und Cmdlets erhalten, um Störungen in bestehenden Umgebungen zu vermeiden. In diesem Artikel sind die beiden Namen austauschbar.
Mit diesem PR wird die neue SQL-Authentifizierungsmethode Active Directory Default eingeführt. Dieser Authentifizierungsmodus erweitert die Möglichkeiten der Benutzerauthentifizierung mit Microsoft Entra ID, die Erweiterung von Anmeldelösungen auf die Clientumgebung, Visual Studio Code, Visual Studio, Azure CLI usw.
Bei diesem Authentifizierungsmodus erhält der Treiber ein Token, indem er DefaultAzureCredential aus der Azure Identity-Bibliothek übergibt, um ein Zugriffstoken zu erhalten. In diesem Modus wird versucht, mit diesen Anmeldeinformationstypen ein Zugriffstoken in folgender Reihenfolge zu erwerben:
-
EnvironmentCredential
- Ermöglicht die Authentifizierung bei Microsoft Entra ID mittels Client-ID und Geheimschlüssel oder mit Benutzername und Kennwort. Dabei müssen folgende Umgebungsvariablen konfiguriert werden: AZURE_TENANT_ID, AZURE_CLIENT_ID, AZURE_CLIENT_SECRET, AZURE_CLIENT_CERTIFICATE_PATH, AZURE_USERNAME, AZURE_PASSWORD (Weitere Informationen)
-
ManagedIdentityCredential
- Versucht, sich bei Microsoft Entra ID mit einer verwalteten Identität zu authentifizieren, die der Bereitstellungsumgebung zugewiesen wurde. Die „Client-ID“ einer „benutzerseitig zugewiesenen verwalteten Identität“ wird aus der Verbindungseigenschaft „Benutzer-ID“ ausgelesen.
-
SharedTokenCacheCredential
- Authentifizierung mit Token in dem von Microsoft-Anwendungen gemeinsam genutzten lokalen Cache.
-
VisualStudioCredential
- Ermöglicht die Authentifizierung mit Microsoft Entra ID anhand von Daten aus Visual Studio
-
VisualStudioCodeCredential
- Ermöglicht die Authentifizierung mit Microsoft Entra ID anhand von Daten aus Visual Studio Code.
-
AzureCliCredential
- Aktiviert die Authentifizierung mit Microsoft Entra ID mithilfe der Azure CLI, um ein Zugriffstoken abzurufen.
InteractiveBrowserCredential ist in der Treiberimplementierung von "Active Directory Default" deaktiviert, und "Active Directory Interactive" ist die einzige Option, die zum Abrufen eines Tokens mit MFA/Interactive Authentication verfügbar ist.
Weitere Anpassungsoptionen sind derzeit nicht verfügbar.
Verbesserungen bei der Registrierung des benutzerdefinierten Hauptschlüsselspeicheranbieters
„Microsoft.Data.SqlClient“ bietet jetzt mehr Kontrolle darüber, an welcher Stelle in einer Anwendung auf Hauptschlüsselspeicheranbieter zugegriffen werden kann, sodass mehrinstanzenfähige Anwendungen und deren Einsatz der Spaltenverschlüsselung/-entschlüsselung besser unterstützt werden. Die folgenden APIs wurden eingeführt, um die Registrierung von benutzerdefinierten Hauptschlüsselspeicheranbietern bei Instanzen von SqlConnection und SqlCommand zu ermöglichen:
public class SqlConnection
{
public void RegisterColumnEncryptionKeyStoreProvidersOnConnection(IDictionary<string, SqlColumnEncryptionKeyStoreProvider> customProviders)
}
public class SqlCommand
{
public void RegisterColumnEncryptionKeyStoreProvidersOnCommand(IDictionary<string, SqlColumnEncryptionKeyStoreProvider> customProviders)
}
Die statische API bei SqlConnection und SqlConnection.RegisterColumnEncryptionKeyStoreProviders wird weiterhin für die globale Registrierung von benutzerdefinierten Hauptschlüsselspeicheranbietern unterstützt. Der global verwaltete Cache für Spaltenverschlüsselungsschlüssel wird nur für global registrierte Anbieter verwendet.
Priorität der Registrierung des Anbieters von Speicher für Spaltenhauptschlüssel
Die integrierten Hauptschlüsselspeicheranbieter, die für den Windows-Zertifikatspeicher, den CNG Store und den CSP verfügbar sind, sind vorab registriert. Wenn einer der integrierten Anbieter von Speicher für Spaltenhauptschlüssel benötigt wird, darf kein Anbieter bei der Verbindungs- oder Befehlsinstanz registriert sein.
Benutzerdefinierte Hauptschlüsselspeicheranbieter können beim Treiber auf drei verschiedenen Ebenen registriert werden. Die globale Ebene ist so, wie sie derzeit ist. Die neuen Registrierungen auf Verbindungs- und Befehlsebene sind anfänglich leer und können mehrmals festgelegt werden.
Für die drei Registrierungen gilt folgende Priorität:
- Die Registrierung auf Befehlsebene wird überprüft, falls sie nicht leer ist.
- Wenn die Registrierung auf Befehlsebene leer ist, wird die Registrierung auf Verbindungsebene überprüft, falls sie nicht leer ist.
- Wenn die Registrierung pro Verbindung leer ist, wird die globale Registrierung überprüft.
Sobald ein Schlüsselspeicheranbieter auf der Registrierungsebene gefunden wurde, fällt der Treiber nicht auf die anderen Registrierungen zurück, um nach einem Anbieter zu suchen. Wenn Anbieter registriert sind, der richtige Anbieter jedoch nicht auf einer Ebene gefunden wurde, wird eine Ausnahme ausgelöst, die nur die registrierten Anbieter in der überprüften Registrierung umfasst.
Priorität des Cache für Spaltenverschlüsselungsschlüssel
Die Spaltenverschlüsselungsschlüssel (Column Encryption Keys, CEKs) für benutzerdefinierte Schlüsselspeicheranbieter, die mit den neuen APIs auf Instanzebene registriert wurden, werden vom Treiber nicht zwischengespeichert. Die Schlüsselspeicheranbieter müssen zur Leistungssteigerung einen eigenen Cache implementieren. Der lokale Cache mit Spaltenverschlüsselungsschlüsseln, die von benutzerdefinierten Schlüsselspeicheranbietern implementiert werden, wird vom Treiber deaktiviert, wenn die Schlüsselspeicheranbieterinstanz im Treiber auf globaler Ebene registriert ist.
Darüber hinaus wurde eine neue API für die Basisklasse SqlColumnEncryptionKeyStoreProvider eingeführt, über die die Gültigkeitsdauer für den Cache festgelegt werden kann:
public abstract class SqlColumnEncryptionKeyStoreProvider
{
// The default value of Column Encryption Key Cache Time to Live is 0.
// Provider's local cache is disabled for globally registered providers.
// Custom key store provider implementation must include column encryption key cache to provide caching support to locally registered providers.
public virtual TimeSpan? ColumnEncryptionKeyCacheTtl { get; set; } = new TimeSpan(0);
}
IP-Adressenpräferenz
Eine neue Verbindungseigenschaft IPAddressPreference wird eingeführt, die es ermöglicht, die Präferenz der IP-Adressfamilie für den Treiber beim Herstellen von TCP-Verbindungen festzulegen. Wenn Transparent Network IP Resolution (in .NET Framework) oder Multi Subnet Failover auf true festgelegt wird, hat diese Einstellung keine Auswirkungen. Im Folgenden sind die drei zulässigen Werte für diese Eigenschaft aufgeführt:
IPv4First
- Dies ist der Standardwert. Vom Treiber werden zunächst aufgelöste IPv4-Adressen verwendet. Wenn mit keiner dieser Adressen eine Verbindung hergestellt werden kann, werden aufgelöste IPv6-Adressen verwendet.
IPv6First
- Vom Treiber werden zunächst aufgelöste IPv6-Adressen verwendet. Wenn mit keiner dieser Adressen eine Verbindung hergestellt werden kann, werden aufgelöste IPv4-Adressen verwendet.
UsePlatformDefault
- Vom Treiber werden IP-Adressen in der Reihenfolge ausprobiert, in der sie in der Antwort auf die DNS-Auflösung empfangen wurden.
3.0 Unterstützung der Zielplattform
- .NET Framework 4.6.1+ (Windows x86, Windows x64)
- .NET Core 2.1+ (Windows x86, Windows x64, Windows Arm64, Windows ARM, Linux, macOS)
- .NET Standard 2.0+ (Windows x86, Windows x64, Windows Arm64, Windows ARM, Linux, macOS)
Versionshinweise für 2.1
Vollständige Versionshinweise, einschließlich Abhängigkeiten, stehen im GitHub-Repository unter Hinweise zur Version 2.1 zur Verfügung.
Neue Features in 2.1
Plattformübergreifende Unterstützung für Always Encrypted
In Microsoft.Data.SqlClient 2.1 wird die Unterstützung für Always Encrypted auf folgenden Plattformen ausgedehnt:
| Unterstützung von Always Encrypted | Unterstützung von Always Encrypted mit Sicheren Enklaven | Ziel-Framework | Microsoft.Data.SqlClient-Version | Betriebssystem |
|---|---|---|---|---|
| Ja | Ja | .NET Framework 4.6+ | Ab 1.1.0 | Windows |
| Ja | Ja | .NET Core 2.1 oder höher | Ab 2.1.01 | Windows, Linux, macOS |
| Ja | Nein2 | .NET-Standard 2.0 | Ab 2.1.0 | Windows, Linux, macOS |
| Ja | Ja | Ab .NET Standard 2.1 und höher | Ab Version 2.1.0 und höher | Windows, Linux, macOS |
1 Vor Microsoft.Data.SqlClient-Version 2.1 wird Always Encrypted nur unter Windows unterstützt.
2 Always Encrypted mit Secure Enclaves wird unter .NET Standard 2.0 nicht unterstützt.
Microsoft Entra-Gerätecodefluss-Authentifizierung
Microsoft.Data.SqlClient 2.1 unterstützt die „Gerätecodeflow“-Authentifizierung mit MSAL.NET. Referenzdokumentation: Ablauf der OAuth2.0-Geräteautorisierungsgewährung
Beispiel für Verbindungszeichenfolge:
Server=<server>.database.windows.net; Authentication=Active Directory Device Code Flow; Database=Northwind;Encrypt=True
Die folgende API ermöglicht die Anpassung des Callback-Mechanismus des Gerätecode-Flows.
public class ActiveDirectoryAuthenticationProvider
{
// For .NET Framework, .NET Core and .NET Standard targeted applications
public void SetDeviceCodeFlowCallback(Func<DeviceCodeResult, Task> deviceCodeFlowCallbackMethod)
}
Microsoft Entra-Authentifizierung mit verwalteter Identität
Microsoft.Data.SqlClient 2.1 bietet Unterstützung für die Microsoft Entra-Authentifizierung mithilfe verwalteter Identitäten.
Die folgenden Schlüsselwörter für den Authentifizierungsmodus werden unterstützt:
- Active Directory mit verwalteter Identität
- Active Directory MSI (für übergreifende Kompatibilität mit Microsoft SQL-Treibern)
Beispiele für Verbindungszeichenfolgen:
// For System Assigned Managed Identity
"Server={serverURL}; Authentication=Active Directory MSI; Encrypt=True; Initial Catalog={db};"
// For System Assigned Managed Identity
"Server={serverURL}; Authentication=Active Directory Managed Identity; Initial Catalog={db};"
// For User Assigned Managed Identity
"Server={serverURL}; Authentication=Active Directory MSI; Encrypt=True; User Id={ObjectIdOfManagedIdentity}; Initial Catalog={db};"
// For User Assigned Managed Identity
"Server={serverURL}; Authentication=Active Directory Managed Identity; Encrypt=True; User Id={ObjectIdOfManagedIdentity}; Initial Catalog={db};"
Erweiterungen der interaktiven Microsoft Entra-Authentifizierung
Microsoft.Data.SqlClient 2.1 fügt die folgenden APIs zum benutzerdefinierten Anpassen der Umgebung zur interaktiven Microsoft Entra-Authentifizierung hinzu:
public class ActiveDirectoryAuthenticationProvider
{
// For .NET Framework targeted applications only
public void SetIWin32WindowFunc(Func<IWin32Window> iWin32WindowFunc);
// For .NET Standard targeted applications only
public void SetParentActivityOrWindowFunc(Func<object> parentActivityOrWindowFunc);
// For .NET Framework, .NET Core and .NET Standard targeted applications
public void SetAcquireAuthorizationCodeAsyncCallback(Func<Uri, Uri, CancellationToken, Task<Uri>> acquireAuthorizationCodeAsyncCallback);
// For .NET Framework, .NET Core and .NET Standard targeted applications
public void ClearUserTokenCache();
}
Konfigurationsabschnitt SqlClientAuthenticationProviders
Microsoft.Data.SqlClient 2.1 enthält nun den neuen Konfigurationsabschnitt SqlClientAuthenticationProviders (ein Klon des vorhandenen Abschnitts SqlAuthenticationProviders). Der vorhandene Konfigurationsabschnitt, SqlAuthenticationProviders, wird weiterhin für die Abwärtskompatibilität unterstützt, sofern der entsprechende Typ definiert ist.
Der neue Abschnitt ermöglicht es, dass Anwendungskonfigurationsdateien sowohl den Abschnitt SqlAuthenticationProviders für System.Data.SqlClient als auch den Abschnitt SqlClientAuthenticationProviders für Microsoft.Data.SqlClient enthalten.
Microsoft Entra-Authentifizierung mit einer Anwendungsclient-ID
Microsoft.Data.SqlClient 2.1 bietet Unterstützung für das Übergeben einer benutzerdefinierten Anwendungsclient-ID an die Microsoft-Authentifizierungsbibliothek. Die Anwendungsclient-ID wird beim Authentifizieren mit Microsoft Entra-ID verwendet.
Die folgenden neuen APIs werden eingeführt:
In ActiveDirectoryAuthenticationProvider wurde ein neuer Konstruktor eingeführt:
Gilt für: Alle .NET-Plattformen (.NET Framework, .NET Core und .NET Standard)
public ActiveDirectoryAuthenticationProvider(string applicationClientId)Verwendung:
string APP_CLIENT_ID = "<GUID>"; SqlAuthenticationProvider customAuthProvider = new ActiveDirectoryAuthenticationProvider(APP_CLIENT_ID); SqlAuthenticationProvider.SetProvider(SqlAuthenticationMethod.ActiveDirectoryInteractive, customAuthProvider); using (SqlConnection sqlConnection = new SqlConnection("<connection_string>")) { sqlConnection.Open(); }Eine neue Konfigurationseigenschaft wurde unter
SqlAuthenticationProviderConfigurationSectionundSqlClientAuthenticationProviderConfigurationSectioneingeführt:Gilt für: .NET Framework und .NET Core
internal class SqlAuthenticationProviderConfigurationSection : ConfigurationSection { ... [ConfigurationProperty("applicationClientId", IsRequired = false)] public string ApplicationClientId => this["applicationClientId"] as string; } // Inheritance internal class SqlClientAuthenticationProviderConfigurationSection : SqlAuthenticationProviderConfigurationSection { ... }Verwendung:
<configuration> <configSections> <section name="SqlClientAuthenticationProviders" type="Microsoft.Data.SqlClient.SqlClientAuthenticationProviderConfigurationSection, Microsoft.Data.SqlClient" /> </configSections> <SqlClientAuthenticationProviders applicationClientId ="<GUID>" /> </configuration> <!--or--> <configuration> <configSections> <section name="SqlAuthenticationProviders" type="Microsoft.Data.SqlClient.SqlAuthenticationProviderConfigurationSection, Microsoft.Data.SqlClient" /> </configSections> <SqlAuthenticationProviders applicationClientId ="<GUID>" /> </configuration>
Unterstützung von Datenklassifizierung, Version 2
Microsoft.Data.SqlClient v2.1 bietet jetzt Unterstützung für die Informationen zur Sensitivitätsklassifizierung von Datenklassifizierung. Die folgenden neuen APIs sind nun verfügbar:
public class SensitivityClassification
{
public SensitivityRank SensitivityRank;
}
public class SensitivityProperty
{
public SensitivityRank SensitivityRank;
}
public enum SensitivityRank
{
NOT_DEFINED = -1,
NONE = 0,
LOW = 10,
MEDIUM = 20,
HIGH = 30,
CRITICAL = 40
}
Sitzungs-ID für eine aktive SqlConnection
Microsoft.Data.SqlClient 2.1 bietet für eine aktive Verbindung die neue SqlConnection-Eigenschaft ServerProcessId.
public class SqlConnection
{
// Returns the session ID (SPID) of the active connection.
public int ServerProcessId;
}
Unterstützung des Trace-Loggings in nativen SNI
Microsoft.Data.SqlClient 2.1 dehnt die vorhandene Implementierung von SqlClientEventSource aus, um die Ereignisablaufverfolgung in „SNI.dll“ zu ermöglichen. Ereignisse müssen mithilfe eines Tools wie Xperf aufgezeichnet werden.
Die Ablaufverfolgung kann aktiviert werden, indem ein Befehl, wie unten gezeigt, an SqlClientEventSource gesendet wird.
// Enables trace events:
EventSource.SendCommand(eventSource, (EventCommand)8192, null);
// Enables flow events:
EventSource.SendCommand(eventSource, (EventCommand)16384, null);
// Enables both trace and flow events:
EventSource.SendCommand(eventSource, (EventCommand)(8192 | 16384), null);
Verbindungszeichenfolgen-Eigenschaft „Befehlstimeout“
Microsoft.Data.SqlClient 2.1 führt die Verbindungszeichenfolgen-Eigenschaft „Befehlstimeout“ ein, um den Standardwert von 30 Sekunden zu überschreiben. Das Timeout für einzelne Befehle kann mithilfe der Eigenschaft CommandTimeout von SqlCommand überschrieben werden.
Beispiele für Verbindungszeichenfolgen:
"Server={serverURL}; Initial Catalog={db}; Encrypt=True; Integrated Security=true; Command Timeout=60"
Entfernen von Symbolen aus nativen SNI
In Microsoft.Data.SqlClient 2.1 haben wir die in v2.0.0 eingeführten Symbole aus dem NuGet-Paket Microsoft.Data.SqlClient.SNI.runtime beginnend mit v2.1.1 entfernt. Die öffentlichen Symbole werden jetzt für Tools wie BinSkim, die Zugriff auf öffentliche Symbole benötigen, auf dem Microsoft-Symbolserver veröffentlicht.
Quellverknüpfung von Microsoft.Data.SqlClient-Symbolen
Ab Microsoft.Data.SqlClient 2.1 werden Microsoft.Data.SqlClient-Symbole mit Quellcode verknüpft und auf dem Microsoft-Symbolserver veröffentlicht, um das Debuggen zu erleichtern, ohne dass Quellcode heruntergeladen werden muss.
2.1 Zielplattformunterstützung
- .NET Framework 4.6+ (Windows x86, Windows x64)
- .NET Core 2.1+ (Windows x86, Windows x64, Windows Arm64, Windows ARM, Linux, macOS)
- .NET Standard 2.0+ (Windows x86, Windows x64, Windows Arm64, Windows ARM, Linux, macOS)
Versionshinweise für 2.0
Vollständige Versionshinweise, einschließlich Abhängigkeiten, stehen im GitHub-Repository unter Hinweise zur Version 2.0 zur Verfügung.
Kritische Änderungen in 2.0
- Die Zugriffsmodifizierer für die Schnittstelle
SqlColumnEncryptionEnclaveProviderdes Enclave-Anbieters wurde vonpublicininternalgeändert. - Konstanten in der
SqlClientMetaDataCollectionNames-Klasse wurden aktualisiert, um die Änderungen in SQL Server widerzuspiegeln. - Der Treiber führt nun eine Überprüfung des Serverzertifikats aus, wenn die SQL Server-Zielinstanz TLS-Verschlüsselung erzwingt. Dies ist die Standardeinstellung für Azure-Verbindungen.
-
SqlDataReader.GetSchemaTable()gibt nun eine leereDataTableanstelle vonnullzurück. - Der Treiber führt nun eine Rundung von Dezimalzahlen durch, um dem Verhalten von SQL Server zu entsprechen. Aus Gründen der Abwärtskompatibilität kann das vorherige Verhalten der Abschneidung mit einem AppContext-Switch aktiviert werden.
- Bei .NET Framework-Anwendungen, die Microsoft.Data.SqlClient nutzen, heißen die zuvor in die Ordner
bin\x64undbin\x86heruntergeladenen SNI.DLL-Dateien nunMicrosoft.Data.SqlClient.SNI.x64.dllundMicrosoft.Data.SqlClient.SNI.x86.dll. Sie werden in das Verzeichnisbinheruntergeladen. - Aus Gründen der Konsistenz werden alte Eigenschaften beim Abrufen von Verbindungszeichenfolgen aus
SqlConnectionStringBuilderdurch neue Synonyme für Verbindungszeichenfolgeneigenschaften ersetzt. Weitere Informationen
Neue Features in Version 2.0
Die folgenden neuen Features wurden in Microsoft.Data.SqlClient 2.0 eingeführt.
DNS-Fehlerresilienz
Der Treiber speichert jetzt IP-Adressen für jede erfolgreiche Verbindung zu einem SQL Server-Endpunkt, der die Funktion unterstützt. Wenn während eines Verbindungsversuchs ein Fehler bei der DNS-Auflösung auftritt, versucht der Treiber, mithilfe einer zwischengespeicherten IP-Adresse für den jeweiligen Server (sofern vorhanden) eine Verbindung herzustellen.
EventSource-Nachverfolgung
Ab diesem Release wird das Erfassen von Ereignisablaufprotokollen unterstützt, um Anwendungen zu debuggen. Zur Erfassung dieser Ereignisse müssen Clientanwendungen auf Ereignisse aus der EventSource-Implementierung von SqlClient lauschen:
Microsoft.Data.SqlClient.EventSource
Weitere Informationen finden Sie unter Aktivieren der Ereignisablaufverfolgung in SqlClient.
Aktivieren von verwalteten Netzwerken unter Windows
Mithilfe der neuen AppContext-Option Switch.Microsoft.Data.SqlClient.UseManagedNetworkingOnWindows kann unter Windows zu Test- und Debuggingzwecken eine verwaltete SNI-Implementierung verwendet werden. Diese Option schaltet das Verhalten des Treibers so um, dass bei Windows-Projekten in .NET Core 2.1 und höher und in .NET Standard 2.0 und höher eine verwaltete SNI verwendet wird. Somit werden alle Abhängigkeiten von nativen Bibliotheken für die Microsoft.Data.SqlClient-Bibliothek beseitigt.
AppContext.SetSwitch("Switch.Microsoft.Data.SqlClient.UseManagedNetworkingOnWindows", true);
Eine vollständige Liste der verfügbaren Switches im Treiber finden Sie unter AppContext-Switches in SqlClient .
Aktivieren des Dezimalabkürzungsverhaltens
Der Treiber rundet die Dezimalskala der Daten standardmäßig, wie es auch durch den SQL Server erfolgt. Aus Gründen der Abwärtskompatibilität können Sie den AppContext-Schalter "Switch.Microsoft.Data.SqlClient.TruncateScaledDecimal" auf "true" festlegen.
AppContext.SetSwitch("Switch.Microsoft.Data.SqlClient.TruncateScaledDecimal", true);
Neue Synonyme für Eigenschaften von Verbindungszeichenfolgen
Für die folgenden vorhandenen Verbindungszeichenfolgeneigenschaften wurden neue Synonyme hinzugefügt, um Verwirrung aufgrund von Abständen bei Eigenschaften zu verhindern, die aus mehreren Wörtern bestehen. Alte Eigenschaftennamen werden weiterhin aus Gründen der Abwärtskompatibilität unterstützt. Aber die neuen Verbindungszeichenfolgeneigenschaften werden jetzt einbezogen, wenn die Verbindungszeichenfolge aus SqlConnectionStringBuilder abgerufen wird.
| Vorhandene Eigenschaft der Verbindungszeichenfolge | Neues Synonym |
|---|---|
| ApplicationIntent | Anwendungsabsicht |
| ConnectRetryCount | Connect Retry Count (Anzahl der Verbindungsversuche) |
| ConnectRetryInterval | Connect Retry Interval (Verbindungswiederholungsintervall) |
| Sperrzeitraum des Pools | Pool Blocking Period (Blockierungszeitraum für einen Pool) |
| MehrereAktiveErgebnisMengen | Multiple Active Result Sets (Mehrere aktive Resultsets) |
| MultiSubnetFailover | Multiple Subnet Failover (Failover für mehrere Subnetze) |
| Transparente Netzwerk-IP-Auflösung | Transparente Netzwerk-IP-Adressauflösung |
| TrustServerCertificate | TrustServerCertificate |
SqlBulkCopy-Eigenschaft „RowsCopied“
Die RowsCopied-Eigenschaft bietet schreibgeschützten Zugriff auf die Anzahl der Datensätze, die in einem laufenden Massenkopiervorgang verarbeitet wurden. Dieser Wert entspricht möglicherweise nicht unbedingt der endgültigen Anzahl von Zeilen, die der Zieltabelle hinzugefügt wurden.
Überschreibungen von Connection Open
Das Standardverhalten von SqlConnection.Open() kann überschrieben werden, um die Verzögerung von zehn Sekunden und automatische erneute Verbindungsversuche zu deaktivieren, die von vorübergehenden Fehlern ausgelöst werden.
using(SqlConnection sqlConnection = new SqlConnection("Data Source=(local);Integrated Security=true;Initial Catalog=AdventureWorks;"))
{
sqlConnection.Open(SqlConnectionOverrides.OpenWithoutRetry);
}
Hinweis
Diese Außerkraftsetzung kann auf SqlConnection.OpenAsync() angewendet werden, beginnend mit Microsoft.Data.SqlClient v6.0.0.
Unterstützung für Benutzernamen bei der interaktiven Active Directory-Authentifizierung
Bei Verwendung der interaktiven Microsoft Entra-Authentifizierung kann sowohl für .NET Framework als auch für .NET Core ein Benutzername in der Verbindungszeichenfolge angegeben werden.
Legen Sie einen Benutzernamen mithilfe der Verbindungszeichenfolgeneigenschaft User ID oder UID fest:
"Server=<server name>; Database=<db name>; Authentication=Active Directory Interactive; User Id=<username>;Encrypt=True;"
Hinweise für die Sortierung für SqlBulkCopy
Hinweise für die Sortierung können bereitgestellt werden, um die Leistung von Massenkopiervorgängen für Tabellen mit gruppierten Indizes zu verbessern. Weitere Informationen finden Sie im Abschnitt Massenkopiervorgänge.
SNI-Abhängigkeitsänderungen
Microsoft.Data.SqlClient (.NET Core und .NET Standard) weisen unter Windows nun eine Abhängigkeit von Microsoft.Data.SqlClient.SNI.runtime auf. Dadurch wird die bisherige Abhängigkeit von runtime.native.System.Data.SqlClient.SNI ersetzt. Die neue Abhängigkeit bietet Unterstützung für die ARM-Plattform sowie die bereits unterstützten Plattformen Arm64, x64 und x86 unter Windows.
2.0 Unterstützung der Zielplattform
- .NET Framework 4.6+ (Windows x86, Windows x64)
- .NET Core 2.1+ (Windows x86, Windows x64, Windows Arm64, Windows ARM, Linux, macOS)
- .NET Standard 2.0+ (Windows x86, Windows x64, Windows Arm64, Windows ARM, Linux, macOS)
Versionshinweise für 1.1
Vollständige Versionshinweise, einschließlich Abhängigkeiten, stehen im GitHub-Repository unter Hinweise zur Version 1.1 zur Verfügung.
Neue Features in Version 1.1
Always Encrypted mit sicheren Enklaven
Always Encrypted ist ab Microsoft SQL Server 2016 verfügbar. Secure Enclaves sind ab Microsoft SQL Server 2019 verfügbar. Die Verbindungszeichenfolgen müssen das erforderliche Nachweisprotokoll und die Nachweis-URL enthalten, um das Enclave-Feature nutzen zu können. Beispiel:
"Attestation Protocol=HGS;Enclave Attestation Url=<attestation_url_for_HGS>"
Weitere Informationen finden Sie unter
- Verwenden von Always Encrypted with the Microsoft .NET Data Provider for SQL Server
- Tutorial: Entwickeln einer .NET-Anwendung mithilfe von Always Encrypted mit Secure Enclaves
1.1 Zielplattformunterstützung
- .NET Framework 4.6+ (Windows x86, Windows x64)
- .NET Core 2.1+ (Windows x86, Windows x64, Linux, macOS)
- .NET Standard 2.0+ (Windows x86, Windows x64, Linux, macOS)
Versionshinweise für 1.0
Die erste Version des Namespace „Microsoft.Data.SqlClient“ bietet gegenüber dem bestehenden Namespace „System.Data.SqlClient“ zusätzliche Funktionen.
Vollständige Versionshinweise, einschließlich Abhängigkeiten, stehen im GitHub-Repository unter Hinweise zur Version 1.0 zur Verfügung.
Neue Features in Version 1.0
Neue Features im Vergleich zu System.Data.SqlClient in .NET Framework 4.7.2
Datenklassifizierung: verfügbar in Azure SQL-Datenbank und Microsoft SQL Server 2019.
UTF-8-Unterstützung: verfügbar in Microsoft SQL Server 2019.
Neue Features im Vergleich zu System.Data.SqlClient in .NET Core 2.2
Datenklassifizierung: verfügbar in Azure SQL-Datenbank und Microsoft SQL Server 2019.
UTF-8-Unterstützung: verfügbar in Microsoft SQL Server 2019.
Authentifizierung: Active Directory-Kennwortauthentifizierungsmodus.
Datenklassifizierung
Das Feature „Datenklassifizierung“ bietet eine neue Gruppe von APIs, die schreibgeschützte Informationen zur Datenvertraulichkeit und -klassifizierung von Objekten verfügbar machen. Diese werden über SqlDataReader abgerufen, wenn die zugrunde liegende Quelle das Feature unterstützt und Metadaten zu Datenvertraulichkeit und -klassifizierung enthält. Sehen Sie sich die Beispielanwendung unter Data Discovery and Classification in SqlClient an.
public class SqlDataReader
{
public Microsoft.Data.SqlClient.DataClassification.SensitivityClassification SensitivityClassification
}
namespace Microsoft.Data.SqlClient.DataClassification
{
public class ColumnSensitivity
{
public System.Collections.ObjectModel.ReadOnlyCollection<Microsoft.Data.SqlClient.DataClassification.SensitivityProperty> SensitivityProperties
}
public class InformationType
{
public string Id
public string Name
}
public class Label
{
public string Id
public string Name
}
public class SensitivityClassification
{
public System.Collections.ObjectModel.ReadOnlyCollection<Microsoft.Data.SqlClient.DataClassification.ColumnSensitivity> ColumnSensitivities
public System.Collections.ObjectModel.ReadOnlyCollection<Microsoft.Data.SqlClient.DataClassification.InformationType> InformationTypes
public System.Collections.ObjectModel.ReadOnlyCollection<Microsoft.Data.SqlClient.DataClassification.Label> Labels
}
public class SensitivityProperty
{
public Microsoft.Data.SqlClient.DataClassification.InformationType InformationType
public Microsoft.Data.SqlClient.DataClassification.Label Label
}
}
Unterstützung für UTF-8
Für UTF-8-Unterstützung sind keine Änderungen am Anwendungscode erforderlich. Diese SqlClient-Änderungen optimieren die Kommunikation zwischen Client und Server, wenn der Server UTF-8 unterstützt und die zugrunde liegende Spaltensortierung UTF-8 ist. Sehen Sie den Abschnitt über UTF-8 unter Neues in SQL Server 2019.
Always Encrypted mit sicheren Enklaven
Im Allgemeinen sollte die vorhandene Dokumentation zu System.Data.SqlClient im .NET Framework und integrierten Anbietern von Speicher für Spaltenhauptschlüssel nun auch für .NET Core gelten.
- Verwenden von Always Encrypted with the .NET Framework Data Provider for SQL Server
- Always Encrypted: Schützen vertraulicher Daten und Speichern von Verschlüsselungsschlüsseln im Windows-Zertifikatspeicher
Authentifizierung
Unterschiedliche Authentifizierungsmodi können angegeben werden, indem in der Verbindungszeichenfolge die Option Authentifizierung verwendet wird. Weitere Informationen finden Sie in der Dokumentation zu SqlAuthenticationMethod.
Benutzerdefinierte Schlüsselspeicheranbieter wie der Azure Key Vault-Anbieter müssen aktualisiert werden, um Microsoft.Data.SqlClient zu unterstützen. Ebenso müssen Enklavenanbieter aktualisiert werden, um Microsoft.Data.SqlClient zu unterstützen.
Always Encrypted wird nur für .NET Framework- und .NET Core-Ziele unterstützt. Für .NET Standard ist keine Unterstützung vorhanden, da .NET Standard bestimmte Verschlüsselungsabhängigkeiten fehlen.
1.0 Zielplattformunterstützung
- .NET Framework 4.6+ (Windows x86, Windows x64)
- .NET Core 2.1+ (Windows x86, Windows x64, Linux, macOS)
- .NET Standard 2.0+ (Windows x86, Windows x64, Linux, macOS)