NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
NuGet · #3045 most downloaded on NuGet
Always Encrypted Azure Key Vault Provider for Microsoft.Data.SqlClient. This library enables .NET applications to use Microsoft Azure Key Vault with Always Encrypted in Microsoft Azure SQL Database and Microsoft SQL Server. The library includes the column master key store provider that allows client applications to access data when a column master key is stored in Microsoft Azure Key Vault. For more information on Always Encrypted, please refer to: https://aka.ms/AlwaysEncrypted. Use this library only with the Microsoft.Data.SqlClient (https://www.nuget.org/packages/Microsoft.Data.SqlClient) client driver.
Last release 12 days ago
29 Sep 2026
Release timing varies
gaps range from 2 weeks to 2.6 years
Most releases are documented
notes for 13 of 15 stable releases
1 version withdrawn
withdrawn after publishing
127 years old
16 releases · first in 1900
This servicing release fixes decimal parameter validation, token expiry handling in connection pool V2, and connection opens that are in progress when
This servicing release fixes decimal parameter validation, token expiry handling in connection pool V2, and connection opens that are in progress when a pool is cleared.
Package version alignment: The SqlClient family packages share the
7.1.1version:
Microsoft.Data.SqlClientMicrosoft.Data.SqlClient.AlwaysEncrypted.AzureKeyVaultProviderMicrosoft.Data.SqlClient.Extensions.AzureMicrosoft.Data.SqlClient.Extensions.AbstractionsMicrosoft.Data.SqlClient.Internal.Logging
Microsoft.SqlServer.Serveris versioned independently and is not part of this release. Applications should use matching7.1.1versions of the driver and its companion packages. The aligned assemblies retainAssemblyVersion 7.0.0.0; upgrading from7.1.0does not require new .NET Framework strong-name binding redirects.
Fixed an ArgumentException when sending zero-valued decimal or SqlDecimal parameters whose precision equals their scale. Nonzero precision validation and support for large decimal values are unchanged. (#4715, #4721, #4732)
Fixed connection pool V2 handing out pooled connections with expired or nearly expired access tokens. The pool now checks token expiry before reuse, matching the default pool's behavior while preserving transaction-affine reuse. This affects only applications that opt in to connection pool V2. (#4734, #4739)
Fixed connection opens failing when ClearPool or ClearAllPools races with an in-flight open. Requests already admitted to the cleared pool can finish, and connections returned to the retired pool are discarded rather than reused. (#4714, #4718, #4740)
One column per quarter.
Fixed an ArgumentException when sending zero-valued decimal or SqlDecimal parameters whose precision equals their scale. Nonzero precision validation and support for large decimal values are unchanged.
(#4715, #4721, #4732)
Fixed connection pool V2 handing out pooled connections with expired or nearly expired access tokens. This affects only applications that opt in to connection pool V2. (#4734, #4739)
Fixed connection opens failing when ClearPool or ClearAllPools races with an in-flight open. Requests already admitted to the cleared pool can finish, and connections returned to the retired pool are discarded rather than reused.
(#4714, #4718, #4740)
Microsoft.Data.SqlClient.AlwaysEncrypted.AzureKeyVaultProvider, Microsoft.Data.SqlClient.Extensions.Azure, Microsoft.Data.SqlClient.Extensions.Abstractions, and Microsoft.Data.SqlClient.Internal.Logging 7.1.1 with no functional or API changes. See the release notes.It closes out the 7.1 preview cycle with application identity reporting for telemetry, the deprecation of TransparentNetworkIPResolution , and a set o…
This is the general availability release of Microsoft.Data.SqlClient 7.1. It closes out the 7.1 preview cycle with application identity reporting for telemetry, the deprecation of TransparentNetworkIPResolution, and a set of connection, transaction, and Named Pipes fixes.
Important — package version alignment: Starting with the 7.0.2 release, the
Microsoft.Data.SqlClientdriver and its companion packages share a single aligned version. The7.1.0GA release continues this alignment; the following packages ship together as7.1.0:
Microsoft.Data.SqlClientMicrosoft.Data.SqlClient.AlwaysEncrypted.AzureKeyVaultProviderMicrosoft.Data.SqlClient.Extensions.AzureMicrosoft.Data.SqlClient.Extensions.AbstractionsMicrosoft.Data.SqlClient.Internal.Logging(
Microsoft.SqlServer.Servercontinues to version independently and remains at1.0.0.)Applications must reference the same versions of
Microsoft.Data.SqlClientand its extensions for best compatibility. In particular, applications that referenceMicrosoft.Data.SqlClient.Extensions.Azuremust upgrade it to7.1.0when upgradingMicrosoft.Data.SqlClientto7.1.0.Compatibility guarantee: All aligned assemblies ship with
FileVersion 7.1.0.xandAssemblyVersion 7.0.0.0. TheAssemblyVersionis unchanged from 7.0.2, so upgrading from7.0.2,7.0.3, or any7.1preview to7.1.0does not require any new .NET Framework strong-name binding redirects. Applications upgrading from7.0.0or7.0.1should note thatExtensions.Azure,Extensions.Abstractions, andInternal.Loggingraised theirAssemblyVersionfrom1.0.0.0to7.0.0.0in 7.0.2; see those release notes for the one-time .NET Framework impact.
What Changed:
RegisteredApplication enum and a matching SqlConnection.RegisteredApplication property that let a library or tool identify itself to SQL Server through version 2 of the TDS USERAGENT feature extension. The payload also carries a new driver-owned 64-bit Driver Properties flag field; bit 0 reports whether connection pool V2 is enabled for the process. Both fields are emitted as unpadded uppercase hexadecimal. (#3201, #4632)Who Benefits:
Impact:
RegisteredApplication is unset reports Unknown (0). On the wire the field itself is new — USERAGENT payload v1 carried no application identifier, while v2 always emits one.Open or OpenAsync. Assigning it while the connection is connecting or open throws InvalidOperationException.using var connection = new SqlConnection(connectionString);
connection.RegisteredApplication = RegisteredApplication.EntityFrameworkCore;
await connection.OpenAsync();ushort-backed and marked [CLSCompliant(false)]. Values are partitioned by range: 0x0001–0x7FFF for Microsoft-defined large-scale applications, 0x8000–0xBFFF for small-scale use, and 0xC000–0xFFFF for public/developer use. Applications that are not yet registered can cast an unassigned value from the appropriate range.Min Pool Size connections report Unknown. Cloned connections preserve the value.TransparentNetworkIPResolution Is Now ObsoleteWhat Changed:
SqlConnectionStringBuilder.TransparentNetworkIPResolution is now marked [Obsolete]. The obsoletion message directs callers to MultiSubnetFailover and notes that Transparent Network IP Resolution (TNIR) is a .NET Framework-only feature. (#4494, #4576)Who Benefits:
MultiSubnetFailover, which addresses the same "connect quickly across multiple DNS-resolved addresses" goal, works consistently on every supported target framework, and is the documented strategy for Always On availability group listeners.Impact:
true on .NET Framework, and MultiSubnetFailover still defaults to false. The property remains .NET Framework-only and is not exposed on modern .NET, where a connection string containing the Transparent Network IP Resolution keyword still throws NotSupportedException. No new AppContext switches were introduced.CS0618 build warning for code that references the property. Suppress it, or migrate to MultiSubnetFailover, at your own pace. Flipping the TNIR and MultiSubnetFailover defaults is deferred to a future major version.Microsoft.Data.SqlClient.SNI and Microsoft.Data.SqlClient.SNI.runtime to v7.1.0 (was v7.1.0-preview3.26226.3). (#4698)SqlConnection, and documented the complete set of properties that conflict with AccessToken. (#4629)SqlDataRecord and SqlMetaData documentation, which incorrectly described the SQL CLR-only SqlContext and SqlPipe types, and clarified whether SqlDataRecord instances can be reused. (#1805, #4440)English (United States). (#4646)TransactionScope rollback — for example, when distributed transaction promotion fails on .NET 8+ where implicit distributed transactions are disabled by default. A subsequent Open() succeeded but BeginTransaction() threw InvalidOperationException ("the connection has been broken"). Connection reset now preserves the transaction when the pooled connection is either a delegated transaction root or enlisted in a transaction, instead of only the latter. (#4001, #4557)GetSchema("DataTypes") never reporting the SQL Server 2025 json type against Azure SQL. The row was filtered by a string comparison against a minimum server version of 17.00.000.0, which Azure SQL can never satisfy because it always reports 12.00.xxxx. The decision now uses the json support flag negotiated through the TDS FEATUREEXTACK token, which is accurate on both Azure SQL and on-premises SQL Server 2025+. (#4592, #4682)Server=np:::1, Server=np:[::1], or Server=\\::1\pipe\sql\query). A UNC path component may not contain a colon, and handing such a path to the OS could trigger an access violation inside LSASS on Windows, forcing a reboot. IPv6 literals are now transcribed to their .ipv6-literal.net form as defined by MS-DTYP 2.2.57, and a colon-bearing host with no valid IPv6 interpretation now fails with the standard invalid-connection-string error. Colon-free host names, LocalDB, localhost, ., and IPv6 over TCP are unaffected. (net8.0/net9.0 only — this is the managed SNI counterpart to the native SNI fix) (#4523, #4558)AppContext.BaseDirectory instead of the current working directory. Place custom retry assemblies in the application base directory; dependencies loaded after provider construction must be resolvable through normal application dependency resolution or an application-supplied handler. (net8.0/net9.0 only — the .NET Framework path does not use AssemblyLoadContext) (#2214, #4547)Switch.Microsoft.Data.SqlClient.UseConnectionPoolV2). Acquiring an already-pooled connection no longer dispatches to the thread pool before attempting an inline, non-blocking acquisition, no longer allocates a timer-backed CancellationTokenSource before it is known that the caller will wait, and no longer allocates a Task on the synchronous completion path. The default pool is unaffected. (#4543)This section summarizes all changes across the 7.1 preview cycle for users upgrading from the latest 7.0 stable release. Changes that were also serviced into 7.0.1, 7.0.2, or 7.0.3 are omitted — they are already present for 7.0.x users.
SqlBatch Support on .NET Framework (net462 only)What Changed:
SqlBatch, SqlBatchCommand, and the related execution methods are now available on the .NET Framework target, so the batching API spans the full supported platform matrix. (#3926)Who Benefits:
Impact:
SqlCommand code is unchanged.SqlConnection.GetSchemaAsyncWhat Changed:
SqlConnection.GetSchema that mirror the existing synchronous shapes and honor a supplied CancellationToken. The .NET Framework schema code paths were unified with the .NET implementation in the process. (#3005)Who Benefits:
Impact:
GetSchema(...) calls are unchanged.What Changed:
virtual asynchronous counterparts to the synchronous methods on SqlColumnEncryptionKeyStoreProvider: DecryptColumnEncryptionKeyAsync, EncryptColumnEncryptionKeyAsync, SignColumnMasterKeyMetadataAsync, and VerifyColumnMasterKeyMetadataAsync. Each accepts an optional CancellationToken, and the default implementations delegate to the existing synchronous methods. (#3672, #3673)Who Benefits:
Impact:
SqlColumnEncryptionAzureKeyVaultProvider overrides all four methods. See the AzureKeyVaultProvider 7.1.0 release notes. (#4540)What Changed:
Connection Idle Timeout connection-string keyword and matching SqlConnectionStringBuilder.IdleTimeout property that let the pool evict connections whose idle time exceeds the configured value. The default is 300 seconds; 0 disables idle expiration and negative values throw ArgumentException. Enforcement is gated on Switch.Microsoft.Data.SqlClient.UseLegacyIdleTimeoutBehavior, which defaults to true to preserve historical pooling behavior. (#4295)Who Benefits:
Impact:
false.What Changed:
ChannelDbConnectionPool, the opt-in pool behind Switch.Microsoft.Data.SqlClient.UseConnectionPoolV2, bringing it to parity with the default WaitHandleDbConnectionPool: transaction support, broken-connection replacement, background warmup and replenishment to Min Pool Size, idle pruning derived from Connection Idle Timeout, optional connection-creation rate limiting, leaked-connection reclamation, and metrics/tracing parity. (#4395, #4396, #4429, #4452, #4463, #4487, #4504, #4529, #4543)SqlConnection.ClearPool(SqlConnection) and SqlConnection.ClearAllPools() now work correctly under pool V2. (#4194)Who Benefits:
Impact:
SqlConnection.RegisteredApplication and USERAGENT payload version 2 (see Changes Since 7.1.0-preview3 above). (#4632)SqlBulkCopy column mappings now accept the SQL Graph pseudo-column aliases $node_id, $edge_id, $from_id, and $to_id as destination column names. (#3677)SqlBatchCommand.CommandBehavior is now honored inside a SqlBatch, and SqlBatch.ExecuteReader respects the CommandBehavior passed to it. Batches that previously set the property and relied on it being ignored will now see it applied. (#4125)ColumnEncryption, ConnectTimeout, FailoverPartner, PacketSize, and WorkstationId. (#4192)json data type to the DataTypes collection returned by SqlConnection.GetSchema. (#3858)What Changed:
TimeSpan timeouts with a shared TimeoutTimer across SqlConnection.Open[Async], pool acquisition, and physical connection creation, so the Connect Timeout budget can be deducted while a request waits in the pool. Enforcement is gated on Switch.Microsoft.Data.SqlClient.UseOverallConnectTimeoutForPoolWait, which defaults to false. Introduces a dependency on Microsoft.Bcl.TimeProvider. (#4270)Who Benefits:
Connect Timeout respected end-to-end instead of the budget effectively restarting when a physical connection is eventually opened.Impact:
Open/OpenAsync under heavy pool contention may surface timeouts sooner than before; successful opens are unaffected.TransparentNetworkIPResolution Is Now ObsoleteLocalAppContextSwitches.UseManagedNetworking is substituted for a constant. The driver builds a single OS-agnostic assembly for all platforms; NuGet package structure and contents are unchanged. (#4207, #4239, #4465, #4474)PacketData linked-list nodes via a bounded free list on StateSnapshot, returning SqlCommand/ExecuteReaderAsync from +120.9% allocated against the 6.1.6 baseline to +0.1%. (#4536)SqlBulkCopy no longer builds SQL Graph column alias mapping tables when neither the source nor destination table contains graph pseudo-columns. (#4535)SqlErrorCollection counters with no errors present, and on expected null-return paths that previously materialized stack traces. (#4072, #4157, #4099, #4102)SqlConnection internal state transitions now use Interlocked.CompareExchange guards. (#4267)ForceNewConnection handling. (#4235, #4237, #4261, #4415)SqlVector<float> now serializes and deserializes little-endian multibyte values explicitly for consistent behavior across architectures. (#3861)EnclaveDiffieHellmanInfo.Size accuracy. (#4346)SqlDataRecord, SqlMetaData, server certificate configuration, and the LCID 1033 locale name. (#4408, #4440, #4646)Microsoft.Bcl.Cryptography, Microsoft.Extensions.Caching.Memory, System.Configuration.ConfigurationManager, and System.Security.Cryptography.Pkcs to v9.0.18 for the net9.0 target framework. Non-net9.0 targets keep their existing 8.0.x pins. (#4507)System.Threading.RateLimiting and Microsoft.Bcl.TimeProvider to the packaged dependency metadata. (#4270, #4507)Microsoft.Data.SqlClient.SNI and Microsoft.Data.SqlClient.SNI.runtime to v7.1.0 (was v6.0.3). (#4564, #4698)CekMdVersion and EkValueCount to align with the TDS specification. (#4240)OverflowException when sending large decimal values (for example decimal.MaxValue) as a parameter with explicit Precision and Scale. This primarily affected Always Encrypted scenarios, where both must always be set. (#1655, #4443)DateOnly value as a parameter with SqlDbType.Variant, and fixed DateOnly values written to a sql_variant column of a table-valued parameter being sent as datetime instead of date (which also caused overflows for values valid for date but out of range for datetime). Reading continues to return DateTime instances by default for backwards compatibility. (net8.0/net9.0 only — .NET Framework has no DateOnly type) (#3953, #3934, #4294, #4439)SqlConnectionFactory timer that woke the process every 30 seconds for the lifetime of the application even when no connection pools existed — including with Pooling=False and after ClearAllPools(). The pruning timer is now armed on demand and disarmed once there is nothing left to prune. A missing .NET Framework unload hook was also added. (#1881, #4479)active-soft-connects and number-of-active-connections could go negative after a failed connection activation, and active-soft-connects, active-hard-connections, and number-of-pooled-connections drifted upward permanently after a broken connection was replaced. (#4504)TransactionScope rollback, which caused a later BeginTransaction() to throw InvalidOperationException. (#4001, #4557)GetSchema("DataTypes") never reporting the json type against Azure SQL. (#4592, #4682)SqlBulkCopy, SqlDataReader.InvokeAsyncCall, SqlCommand.Reader, and SqlCommand.Xml that captured fatal exceptions such as OutOfMemoryException into faulted Tasks instead of letting them propagate. (#4437)SqlDataReader streaming bug where calling IsDBNull() before reading a streamed value could skip column data. (#4082)SqlConnection.TryOpenInner that could surface as InvalidCastException; the same race now returns a deterministic InvalidOperationException. (#4179)LoginWithFailover to validate parser state before continuing, preventing null-reference failures during failover login. (#4140)Protocol=None or Protocol=Admin is specified. (#4180)CancellationTokenSource leaks in SqlDataReader, SqlConnection, the SqlCommand reconnect paths, and the sequential-stream helpers. (#4009)What Changed:
SQL Server 2000 type-system compatibility option. The TypeSystem.SQLServer2000 enum value and the Type System Version=SQL Server 2000 connection-string branch are gone. (#4015)Who Benefits:
Latest, SQL Server 2005, SQL Server 2008, SQL Server 2012) now matches the implementation exactly.Impact:
Type System Version=SQL Server 2000 now throws ArgumentException when the connection is opened. Switch to a supported value such as Latest. There is no change to which servers the driver connects to — SQL Server 7.0 and 2000 were already rejected during login version negotiation.We thank the following public contributors. Their efforts toward this project are very much appreciated.
General availability of Microsoft.Data.SqlClient 7.1. The sections below list the changes since 7.1.0-preview3. See the 7.1.0 release notes for the cumulative list of changes since the 7.0.3 stable release.
RegisteredApplication enum and a matching SqlConnection.RegisteredApplication property that let a library or tool identify itself to SQL Server through version 2 of the TDS USERAGENT feature extension. The payload also carries a new driver-owned 64-bit Driver Properties flag field; bit 0 reports whether connection pool V2 is enabled for the process. Application identity is client-supplied telemetry and must never be used for authorization or any other security decision. The value must be set before Open/OpenAsync and is not part of the connection pool key.
(#3201, #4632)SqlConnectionStringBuilder.TransparentNetworkIPResolution is now marked [Obsolete], directing callers to MultiSubnetFailover. There is no runtime behavior change: connection string defaults are untouched and no new AppContext switches were introduced. The only visible effect is a CS0618 build warning for code that references the property.
(#4494, #4576)
Unified the exception message raised when conflicting token-based and SSPI authentication properties are set on the same SqlConnection, and documented the complete set of properties that conflict with AccessToken.
(#4629)
Documentation corrections for SqlDataRecord, SqlMetaData, and the LCID 1033 locale name.
(#1805,
#4440,
#4646)
Updated Microsoft.Data.SqlClient.SNI and Microsoft.Data.SqlClient.SNI.runtime to v7.1.0 (was v7.1.0-preview3.26226.3).
(#4698)
Fixed a pooled connection being returned to the pool in a broken state after a TransactionScope rollback — for example, when distributed transaction promotion fails on .NET 8+ where implicit distributed transactions are disabled by default. Connection reset now preserves the transaction when the pooled connection is either a delegated transaction root or enlisted in a transaction.
(#4001, #4557)
Fixed GetSchema("DataTypes") never reporting the SQL Server 2025 json type against Azure SQL. The decision now uses the json support flag negotiated through the TDS FEATUREEXTACK token instead of a server version string comparison.
(#4592, #4682)
Fixed a malformed UNC pipe path being composed for IPv6 literal server names over Named Pipes in managed SNI, which could trigger an access violation inside LSASS on Windows and force a reboot. IPv6 literals are now transcribed to their .ipv6-literal.net form. (net8.0/net9.0 only)
(#4523, #4558)
Fixed configurable retry logic installing a permanent, process-wide assembly-resolution handler that could interfere with unrelated assembly loading. The handler is now installed only while an explicitly configured custom retry provider is resolved and constructed, and probes AppContext.BaseDirectory instead of the current working directory. (net8.0/net9.0 only)
(#2214, #4547)
Fixed open/close throughput regressions in the opt-in connection pool V2 (Switch.Microsoft.Data.SqlClient.UseConnectionPoolV2). The default pool is unaffected.
(#4543)
Microsoft.Data.SqlClient.Extensions.Azure 7.1.0 with an internal Entra ID authority parsing clarification and no behavior change. See release notes.Microsoft.Data.SqlClient.AlwaysEncrypted.AzureKeyVaultProvider, Microsoft.Data.SqlClient.Extensions.Abstractions, and Microsoft.Data.SqlClient.Internal.Logging 7.1.0 with no functional or API changes since preview3. See the Azure Key Vault provider, Abstractions, and Logging release notes.This update brings the following changes since the 7.0.2 release:
This update brings the following changes since the 7.0.2 release:
The core driver and its companion packages ship together as version 7.0.3. Update the companion packages you use alongside the driver to 7.0.3. Assembly versions remain 7.0.0.0, unchanged from 7.0.2.
Microsoft.Data.SqlClient.SNI and Microsoft.Data.SqlClient.SNI.runtime dependencies to 6.0.3 (was 6.0.2).Fixed a SqlBulkCopy regression in environments where the application login cannot read sys.all_columns. Bulk copy now falls back to the earlier column-discovery behavior when that permission is unavailable. Support for hidden columns and SQL Graph column aliases still requires access to the metadata view.
(#4370, #4306, #4402)
Fixed a memory-allocation regression in connection and command operations caused by formatting diagnostic strings even when tracing was disabled. Also corrected trace messages that reported an incorrect object ID or could throw FormatException when traced values contained braces.
(#4528, #4533)
Fixed ServerCertificate validation on the managed SNI path so the configured certificate is compared against the server certificate even when the server certificate passes chain and host-name validation. When certificate validation is enabled, a missing, unreadable, or invalid certificate file, a certificate mismatch, or a missing server certificate now causes the TLS handshake to fail instead of bypassing the configured certificate check. (net8.0/net9.0 only)
(#4445, #4583)
Fixed Always Encrypted VSM/HGS enclave attestation to verify that the enclave public key used to establish a session matches the key committed to by the signed attestation report. Missing, malformed, or mismatched key-binding data now causes attestation to fail before the session secret is derived.
(#4532, #4553)
Fixed SqlConnection.AccessTokenCallback not disabling Transparent Network IP Resolution by default, making it consistent with SqlConnection.AccessToken. An explicitly configured TransparentNetworkIPResolution connection-string value still takes precedence. (net462 only)
(#4520, #4561)
Fixed authentication state handling so clearing SqlConnection.AccessToken, AccessTokenCallback, or SspiContextProvider preserves the other authentication values in the connection pool key. Cloning a connection or updating its credential also preserves its SspiContextProvider. Combining a non-null SspiContextProvider with AccessToken or AccessTokenCallback now throws InvalidOperationException instead of silently discarding authentication state; applications must use one authentication mechanism at a time.
(#4520, #4561, #4644)
Fixed configurable retry logic installing a permanent, process-wide assembly-resolution handler that could interfere with unrelated assembly loading. The handler is now active only while an explicitly configured custom retry provider is resolved and constructed, and probes AppContext.BaseDirectory instead of the current working directory. Place custom retry assemblies in the application base directory; dependencies loaded after provider construction must be resolvable through normal application dependency resolution or an application-provided handler. (net8.0/net9.0 only)
(#2214, #4547, #4663)
We thank the following public contributors. Their efforts toward this project are very much appreciated.
Full details: release-notes/7.0/7.0.3.md
Breaking change (.NET Framework only): As part of this alignment, the AssemblyVersion of Microsoft.Data.SqlClient.Extensions.Azure , Microsoft.Data.Sq…
This update brings the following changes since the 7.0.1 release:
Important — package version alignment: Starting with 7.0.2, the
Microsoft.Data.SqlClientdriver and its companion packages share a single aligned version. The following packages now ship together as7.0.2:
Microsoft.Data.SqlClientMicrosoft.Data.SqlClient.AlwaysEncrypted.AzureKeyVaultProviderMicrosoft.Data.SqlClient.Extensions.AzureMicrosoft.Data.SqlClient.Extensions.AbstractionsMicrosoft.Data.SqlClient.Internal.Logging(
Microsoft.SqlServer.Servercontinues to version independently and remains at1.0.0.)Applications must reference the same versions of
Microsoft.Data.SqlClientand its extensions for best compatibility. In particular, applications that referenceMicrosoft.Data.SqlClient.Extensions.Azuremust upgrade it to7.0.2when upgradingMicrosoft.Data.SqlClientto7.0.2.
Breaking change (.NET Framework only): As part of this alignment, the
AssemblyVersionofMicrosoft.Data.SqlClient.Extensions.Azure,Microsoft.Data.SqlClient.Extensions.Abstractions, andMicrosoft.Data.SqlClient.Internal.Loggingchanged from1.0.0.0to7.0.0.0(theMicrosoft.Data.SqlClientandMicrosoft.Data.SqlClient.AlwaysEncrypted.AzureKeyVaultProviderassembly versions are unchanged). On .NET Framework,AssemblyVersionis part of the strong-name identity, so applications that drop these assemblies into an existing deployment without rebuilding must rebuild against the 7.0.2 packages (or add binding redirects). Applications on .NET / .NET Core are not affected.
The following companion packages ship aligned as 7.0.2. See their individual release notes for package-specific changes (including the Microsoft.Data.SqlClient.Extensions.Azure WAM broker support):
Fixed a NullReferenceException in SqlCommand.Cancel(). The diagnostic message built during cancellation dereferenced the active connection directly; it now uses a null-conditional access so cancellation no longer throws when the connection has already been torn down.
(#4372,#4373)
Fixed a NullReferenceException in SqlDataReader when calling GetBytes/GetChars with a null destination buffer. The argument-validation path that constructs the InvalidDestinationBufferIndex exception now guards against the null buffer so the correct ArgumentException is surfaced instead of an NRE.
(#4159,#4206)
Fixed Always Encrypted column master key signature verification incorrectly reusing cached results. The SignatureVerificationCache lookup logic was corrected so signature verification outcomes are cached and retrieved against the correct key, preventing stale or mismatched verification results.
(#4339,#4343)
What Changed:
Who Benefits:
Impact:
We thank the following public contributors. Their efforts toward this project are very much appreciated.
This update brings the following changes since the 7.0.1 release. See the full release notes for detailed descriptions.
Important — package version alignment: Starting with 7.0.2, the
Microsoft.Data.SqlClientdriver and its companion packages share a single aligned version. The following packages now ship together as7.0.2:
Microsoft.Data.SqlClientMicrosoft.Data.SqlClient.AlwaysEncrypted.AzureKeyVaultProviderMicrosoft.Data.SqlClient.Extensions.AzureMicrosoft.Data.SqlClient.Extensions.AbstractionsMicrosoft.Data.SqlClient.Internal.Logging(
Microsoft.SqlServer.Servercontinues to version independently and remains at1.0.0.)Applications must reference the same versions of
Microsoft.Data.SqlClientand its extensions for best compatibility. In particular, applications that referenceMicrosoft.Data.SqlClient.Extensions.Azuremust upgrade it to7.0.2when upgradingMicrosoft.Data.SqlClientto7.0.2.
Breaking change (.NET Framework only): As part of this alignment, the
AssemblyVersionofMicrosoft.Data.SqlClient.Extensions.Azure,Microsoft.Data.SqlClient.Extensions.Abstractions, andMicrosoft.Data.SqlClient.Internal.Loggingchanged from1.0.0.0to7.0.0.0. On .NET Framework,AssemblyVersionis part of the strong-name identity, so applications that drop these assemblies into an existing deployment without rebuilding must rebuild against the 7.0.2 packages (or add binding redirects). Applications on .NET / .NET Core are not affected.Microsoft.Data.SqlClient.AlwaysEncrypted.AzureKeyVaultProvideralready used a7.xassembly version and is unaffected.
Fixed a NullReferenceException in SqlCommand.Cancel() when the active connection has already been torn down.
(#4372,
#4373)
Fixed a NullReferenceException in SqlDataReader.GetBytes/GetChars when called with a null destination buffer.
(#4159,
#4206)
Fixed Always Encrypted column master key signature verification incorrectly reusing cached results. (#4339, #4343)
Hardened TDS token parsing by adding data-length bounds checks for token and feature-extension-acknowledgment data. (#4340, #4358)
Released Microsoft.Data.SqlClient.Extensions.Azure 7.0.2, adding WAM broker support for Entra ID authentication modes on Windows. See release notes.
(#4288,
#4388)
Re-shipped Microsoft.Data.SqlClient.AlwaysEncrypted.AzureKeyVaultProvider, Microsoft.Data.SqlClient.Extensions.Abstractions, and Microsoft.Data.SqlClient.Internal.Logging as 7.0.2 (version alignment only, no functional changes). See release notes for AKV, Abstractions, and Logging.
Deprecation of SqlAuthenticationMethod.ActiveDirectoryPassword
This is the general availability release of Microsoft.Data.SqlClient 7.0, a major milestone for the .NET data provider for SQL Server. This release addresses the most upvoted issue in the repository's history — extracting Azure dependencies from the core package — introduces pluggable SSPI authentication, adds enhanced routing for Azure SQL Hyperscale, and delivers async read performance improvements.
Also released as part of this milestone:
Microsoft.Data.SqlClient.Extensions.Azure package installed, guiding users to install the correct package. (#3962, #4046)Microsoft.Data.SqlClient.Extensions.Logging package to Microsoft.Data.SqlClient.Internal.Logging to indicate it is for internal use only and should not be referenced directly by application code. (#4038)Azure.Core to v1.51.1Azure.Identity to v1.18.0Azure.Security.KeyVault.Keys to v4.9.0Microsoft.Extensions.Caching.Memory to v9.0.13 (.NET 9.0)Microsoft.IdentityModel.JsonWebTokens to v8.16.0Microsoft.IdentityModel.Protocols.OpenIdConnect to v8.16.0Microsoft.Bcl.Cryptography to v9.0.13 (.NET 9.0)System.Configuration.ConfigurationManager to v9.0.13 (.NET 9.0)System.Diagnostics.DiagnosticSource to v10.0.3System.Security.Cryptography.Pkcs to v9.0.13 (.NET 9.0)System.Text.Json to v10.0.3System.Threading.Channels to v10.0.3System.ValueTuple to v4.6.2This section summarizes all changes across the 7.0 preview cycle for users upgrading from the latest 6.1 stable release.
What Changed:
Microsoft.Data.SqlClient package no longer depends on Azure.Core, Azure.Identity, or their transitive dependencies (e.g., Microsoft.Identity.Client, Microsoft.Web.WebView2). Azure Active Directory / Entra ID authentication functionality (ActiveDirectoryAuthenticationProvider and related types) has been extracted into a new Microsoft.Data.SqlClient.Extensions.Azure package. (#1108, #3680, #3902, #3904, #3908, #3917, #3982, #3978, #3986)Microsoft.Data.SqlClient.Extensions.Abstractions (shared types between the core driver and extensions) and Microsoft.Data.SqlClient.Internal.Logging (shared ETW tracing infrastructure). (#3626, #3628, #3967, #4038)Who Benefits:
Impact:
ActiveDirectoryInteractive, ActiveDirectoryDefault, ActiveDirectoryManagedIdentity, etc.) must now install the Microsoft.Data.SqlClient.Extensions.Azure NuGet package separately:dotnet add package Microsoft.Data.SqlClient.Extensions.Azure
What Changed:
SspiContextProvider property on SqlConnection, completing the SSPI extensibility work begun in 6.1.0. Applications can now supply a custom SSPI context provider for integrated authentication, enabling custom Kerberos ticket negotiation and NTLM username/password authentication scenarios. (#2253, #2494)Who Benefits:
Impact:
SspiContextProvider on SqlConnection before opening the connection:var connection = new SqlConnection(connectionString);
connection.SspiContextProvider = new MyKerberosProvider();
connection.Open();SspiContextProvider is part of the connection pool key. Care should be taken when using this property to ensure the implementation returns a stable identity per resource.What Changed:
Who Benefits:
ExecuteReaderAsync with big result sets, streaming scenarios, or bulk data retrieval).Impact:
AppContext.SetSwitch("Switch.Microsoft.Data.SqlClient.UseCompatibilityAsyncBehaviour", false);
AppContext.SetSwitch("Switch.Microsoft.Data.SqlClient.UseCompatibilityProcessSni", false);false enables the new async processing path. By default, the driver uses the existing (compatible) behavior.What Changed:
Who Benefits:
Impact:
What Changed:
Who Benefits:
Impact:
What Changed:
Enabled SqlClientDiagnosticListener for SqlCommand on .NET Framework, closing a long-standing observability gap where diagnostic events were previously only emitted on .NET Core. (#3658)
Brought the 15 strongly-typed diagnostic event classes in the Microsoft.Data.SqlClient.Diagnostics namespace — originally introduced for .NET Core in 6.0 — to .NET Framework as part of the codebase merge. Both platforms now use the same strongly-typed event model. The types cover command, connection, and transaction lifecycle events:
SqlClientCommandBefore, SqlClientCommandAfter, SqlClientCommandErrorSqlClientConnectionOpenBefore, SqlClientConnectionOpenAfter, SqlClientConnectionOpenErrorSqlClientConnectionCloseBefore, SqlClientConnectionCloseAfter, SqlClientConnectionCloseErrorSqlClientTransactionCommitBefore, SqlClientTransactionCommitAfter, SqlClientTransactionCommitErrorSqlClientTransactionRollbackBefore, SqlClientTransactionRollbackAfter, SqlClientTransactionRollbackError(#3493)
Who Benefits:
SqlClientDiagnosticListener events for observability, distributed tracing, or custom telemetry. These users now have parity with .NET Core, gaining IntelliSense, compile-time safety, and eliminating the need to access diagnostic payloads via reflection or dictionary lookups.Impact:
SqlCommand now emits the same diagnostic events that were previously only available on .NET Core. Subscribers to DiagnosticListener events (e.g., Microsoft.Data.SqlClient.WriteCommandBefore) receive the strongly-typed objects:listener.Subscribe(new Observer<KeyValuePair<string, object?>>(kvp =>
{
if (kvp.Value is SqlClientCommandBefore before)
{
Console.WriteLine($"Executing: {before.Command.CommandText}");
}
}));IReadOnlyList<KeyValuePair<string, object>> for backward compatibility with code that iterates properties generically.SqlConfigurableRetryFactory.BaselineTransientErrors static property exposing the default transient error codes list as a ReadOnlyCollection<int>, making it easier to extend the default list with application-specific error codes. (#3903)Switch.Microsoft.Data.SqlClient.EnableMultiSubnetFailoverByDefault to set MultiSubnetFailover=true globally without modifying connection strings. (#3841)Switch.Microsoft.Data.SqlClient.IgnoreServerProvidedFailoverPartner to let the client ignore server-provided failover partner info in Basic Availability Groups. (#3625)Switch.Microsoft.Data.SqlClient.EnableUserAgent). (#3606)SqlAuthenticationMethod.ActiveDirectoryPasswordWhat Changed:
SqlAuthenticationMethod.ActiveDirectoryPassword (the ROPC flow) is now marked [Obsolete] and will generate compiler warnings. This aligns with Microsoft's move toward mandatory multifactor authentication. (#3671)Who Benefits:
Impact:
Authentication=Active Directory Password, migrate to a supported alternative:| Scenario | Recommended Authentication |
|---|---|
| Interactive / desktop apps | Active Directory Interactive |
| Service-to-service | Active Directory Service Principal |
| Azure-hosted workloads | Active Directory Managed Identity |
| Developer / CI environments | Active Directory Default |
IoControlCodeAccess and IoControlTransferType) that were accidentally made public during the project merge. (#3900)Constrained Execution Region error handling blocks and associated SqlConnection cleanup. (#3535)SqlBulkCopy to operate on hidden columns. (#3590)ExecuteScalar to propagate errors when the server sends data followed by an error token. (#3912)NullReferenceException in SqlDataAdapter when processing batch scenarios. (#3857)AppContextSwitchOverrides configuration field. (#3960)TdsParserStateObject.TryReadPlpBytes where zero-length reads returned null instead of an empty array. (#3872)CreatePerformanceCounters. (#3623)SetProvider to return immediately if user-defined authentication provider found. (#3620)We thank the following public contributors. Their efforts toward this project are very much appreciated.
This section summarizes all changes across the 7.0 preview cycle for users upgrading from the latest 6.1 stable release. See the full release notes for detailed descriptions.
Also released as part of this milestone:
Breaking: Removed Azure dependencies from the core package. Entra ID authentication (ActiveDirectoryAuthenticationProvider and related types) has been extracted into a new Microsoft.Data.SqlClient.Extensions.Azure package. The core Microsoft.Data.SqlClient package no longer depends on Azure.Core, Azure.Identity, or their transitive dependencies. Applications using Entra ID authentication must now install Microsoft.Data.SqlClient.Extensions.Azure separately.
(#1108,
#3680,
#3902,
#3904,
#3908,
#3917,
#3982,
#3978,
#3986)
Two additional packages were introduced to support this separation: Microsoft.Data.SqlClient.Extensions.Abstractions (shared types between the core driver and extensions) and Microsoft.Data.SqlClient.Internal.Logging (shared ETW tracing infrastructure).
(#3626,
#3628,
#3967,
#4038)
Deprecated SqlAuthenticationMethod.ActiveDirectoryPassword (ROPC flow). The method is now marked [Obsolete] and will generate compiler warnings. Migrate to ActiveDirectoryInteractive, ActiveDirectoryServicePrincipal, ActiveDirectoryManagedIdentity, or ActiveDirectoryDefault.
(#3671)
Reverted public visibility of internal interop enums (IoControlCodeAccess and IoControlTransferType) that were accidentally made public during the project merge.
(#3900)
Removed Constrained Execution Region error handling blocks and associated SqlConnection cleanup.
(#3535)
Performance improvements across SqlStatistics timing, Always Encrypted scenarios, and connection opening: (#3609, #3612, #3732, #3660, #3791, #3772, #3554)
Allow SqlBulkCopy to operate on hidden columns.
(#3590)
Updated UserAgent feature to use a pipe-delimited format, replacing the previous JSON format. (#3826)
Minor improvements to Managed SNI tracing to capture continuation events and errors. (#3859)
Added SspiContextProvider abstract class and SqlConnection.SspiContextProvider property, enabling custom SSPI authentication for scenarios like cross-domain Kerberos negotiation and NTLM username/password authentication.
(#2253,
#2494)
Continued refinement of packet multiplexing with bug fixes and stability improvements, plus new app context switches for opt-in control. (#3534, #3537, #3605)
Added support for enhanced routing, a TDS feature that allows the server to redirect connections to a specific server and database during login, enabling Azure SQL Hyperscale read replica load balancing. (#3641, #3969, #3970, #3973)
Updated pipelines and test suites to compile the driver using the .NET 10 SDK. (#3686)
Added SqlConfigurableRetryFactory.BaselineTransientErrors static property exposing the default transient error codes list as a ReadOnlyCollection<int>.
(#3903)
Added app context switch Switch.Microsoft.Data.SqlClient.EnableMultiSubnetFailoverByDefault to set MultiSubnetFailover=true globally without modifying connection strings.
(#3841)
Added app context switch Switch.Microsoft.Data.SqlClient.IgnoreServerProvidedFailoverPartner to let the client ignore server-provided failover partner info in Basic Availability Groups.
(#3625)
Enabled SqlClientDiagnosticListener for SqlCommand on .NET Framework, closing a long-standing observability gap where diagnostic events were previously only available on .NET Core.
(#3658)
Brought the 15 strongly-typed diagnostic event classes in the Microsoft.Data.SqlClient.Diagnostics namespace (e.g., SqlClientCommandBefore, SqlClientConnectionOpenAfter, SqlClientTransactionCommitError) to .NET Framework as part of the codebase merge. These types were originally introduced for .NET Core in 6.0.
(#3493)
Enabled User Agent Feature Extension (opt-in via Switch.Microsoft.Data.SqlClient.EnableUserAgent).
(#3606)
Added actionable error message when Entra ID authentication methods are used without the Microsoft.Data.SqlClient.Extensions.Azure package installed.
(#3962,
#4046)
Fixed a connection performance regression where SPN generation was triggered for non-integrated authentication modes (e.g., SQL authentication) on the native SNI path. (#3929)
Fixed ExecuteScalar to propagate errors when the server sends data followed by an error token.
(#3912)
Fixed NullReferenceException in SqlDataAdapter when processing batch scenarios.
(#3857)
Fixed reading of multiple app context switches from a single AppContextSwitchOverrides configuration field.
(#3960)
Fixed an edge case in TdsParserStateObject.TryReadPlpBytes where zero-length reads returned null instead of an empty array.
(#3872)
Fixed issue where extra connection deactivation was occurring. (#3758)
Fixed debug assertion in connection pool (no impact to production code). (#3587)
Prevented uninitialized performance counters escaping CreatePerformanceCounters.
(#3623)
Fixed SetProvider to return immediately if user-defined authentication provider found.
(#3620)
Fixed connection pool concurrency issue. (#3632)
This update includes the following changes since the 6.1.1 release:
This update includes the following changes since the 6.1.1 release:
System.InvalidOperationException #3629This update includes the following changes since the 6.1.0 release:
This update includes the following changes since the 6.1.0 release:
SqlVector<T>.Null API signature in Reference assembly. #3521This update brings the following changes since the 6.1.0-preview2 release:
This update brings the following changes since the 6.1.0-preview2 release:
No new features were added.
What Changed:
Who Benefits:
Impact:
What Changed:
CreateNull() method.Size property was removed.Who Benefits:
Impact:
_No changes since the last preview release_
No changes since the last preview release
This update brings the below changes over the previous release:
This update brings the below changes over the previous release:
Microsoft.Data.SqlClient.SNI (.NET Framework dependency) and Microsoft.Data.SqlClient.SNI.runtime (.NET Core/Standard dependency) version to 5.1.0. #1889 which includes fix for AppDomain crash in issue #1418, TLS 1.3 Support, removal of ARM32 binaries, and support for the ServerCertificate option.Added support for column encryption key caching when the server supports retrying queries that require enclave computations #1062
Microsoft.Data.SqlClient.SNI (.NET Framework dependency) and Microsoft.Data.SqlClient.SNI.runtime (.NET Core/Standard dependency) version to v3.0.0 #1102Added internal driver support to provide resiliency to DNS failures #594
Active Directory Integrated, Active Directory Interactive and Active Directory Service Principal authentication mode for .NET Core and .NET Standard #560Active Directory Service Principal authentication mode for .NET Framework #560ORDER hints in SqlBulkCopy for improved performance #540SqlSequentialStream multipacket read stalling issue in .NET Core #603applicationintent connection string property issue #585SqlColumnEncryptionEnclaveProvider to be internal #602 - This change is not likely to impact customer applications since secure enclaves is a relatively new feature and they would have had to implement their own enclave provider, which is not a trivial task.SqlClientMetaDataCollectionNames exposed constants by removing non-existing constants and adding new to the metadata collection #580Nothing published for this version
Fixed deadlock issues by reverting async changes to SNIPacket #425
Added support for |DataDirectory| macro in AttachDBFilename for .NET Core client #284
AttachDBFilename for .NET Core client #284SNIPacket.ReadFromStreamAsync to not consume same ValueTask twice #295SqlException on SqlTransaction.Commit #299Nothing published for this version
Your coding agent can read these notes before it upgrades. Set up the MCP server →