Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
117 changes: 117 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,123 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/)

> **Note:** Releases are sorted in reverse chronological order (newest first).

## [Preview Release 7.1.0-preview2] - 2026-07-09

This update brings the following changes since the [7.1.0-preview1](release-notes/7.1/7.1.0-preview1.md) release.
See the [full release notes](release-notes/7.1/7.1.0-preview2.md) for detailed descriptions.

> **Important — package version alignment:** Starting with the [7.0.2](release-notes/7.0/7.0.2.md) release, the `Microsoft.Data.SqlClient` driver and its companion packages share a single aligned version. Preview 2 of the `7.1` line continues this alignment; the following packages now ship together as `7.1.0-preview2`:
>
> - `Microsoft.Data.SqlClient`
> - `Microsoft.Data.SqlClient.AlwaysEncrypted.AzureKeyVaultProvider`
> - `Microsoft.Data.SqlClient.Extensions.Azure`
> - `Microsoft.Data.SqlClient.Extensions.Abstractions`
> - `Microsoft.Data.SqlClient.Internal.Logging`
>
> (`Microsoft.SqlServer.Server` continues to version independently and remains at `1.0.0`.)
>
> Applications that reference `Microsoft.Data.SqlClient.Extensions.Azure` must upgrade it to `7.1.0-preview2` when upgrading `Microsoft.Data.SqlClient` to `7.1.0-preview2`.
>
> **Compatibility guarantee:** All aligned assemblies ship with `FileVersion 7.1.0.x` and `AssemblyVersion 7.0.0.0`. The `AssemblyVersion` is unchanged from [7.0.2](release-notes/7.0/7.0.2.md), so upgrading from `7.0.2` to `7.1.0-preview2` does **not** require any new .NET Framework strong-name binding redirects. See the 7.0.2 release notes for the original `AssemblyVersion` alignment (the one-time breaking change that raised `AssemblyVersion` from `1.0.0.0` to `7.0.0.0` for `Extensions.Azure`, `Extensions.Abstractions`, and `Internal.Logging`; `AzureKeyVaultProvider` was already on `7.x`).

### Added

- Added `SqlConnection.GetSchemaAsync` overloads mirroring the existing synchronous shapes.
([#3005](https://github.com/dotnet/SqlClient/pull/3005))

- Added SQL Graph column-alias support (`$node_id`, `$edge_id`, `$from_id`, `$to_id`) as destination columns in `SqlBulkCopy`.
([#3677](https://github.com/dotnet/SqlClient/pull/3677))

- `SqlBatchCommand.CommandBehavior` (a driver-specific property that existed since batching was introduced but was previously ignored) is now honored during `SqlBatch` execution, and `SqlBatch.ExecuteReader` now respects the `CommandBehavior` value passed to it.
([#4125](https://github.com/dotnet/SqlClient/pull/4125))

- Added a `Connection Idle Timeout` connection-string keyword and matching `SqlConnectionStringBuilder.IdleTimeout` property to evict idle connections in pool v2 (default `300` seconds; `0` disables). Enforcement is opt-in via `Switch.Microsoft.Data.SqlClient.UseLegacyIdleTimeoutBehavior=false`; the default preserves the historical pooling behavior.
([#4295](https://github.com/dotnet/SqlClient/pull/4295))

- Added Windows Account Manager (WAM) broker support for the supported Entra ID authentication modes on Windows, including the new `ActiveDirectoryAuthenticationProviderOptions` type, an `ActiveDirectoryAuthenticationProvider(ActiveDirectoryAuthenticationProviderOptions)` constructor, a cross-platform `SetParentActivityOrWindowFunc(Func<object>?)`, and a `useWamBroker` configuration attribute.
([#4288](https://github.com/dotnet/SqlClient/pull/4288))

### Changed

- The `Connect Timeout` budget is now propagated through pool acquisition via a shared `TimeoutTimer`, so time spent waiting in the pool is deducted from the overall timeout. Adds a dependency on `Microsoft.Bcl.TimeProvider`.
([#4270](https://github.com/dotnet/SqlClient/pull/4270))

- Implemented pool shutdown for `ChannelDbConnectionPool` and added automatic pool size reduction (pruning) for the channel-based pool.
([#4302](https://github.com/dotnet/SqlClient/pull/4302),
[#4304](https://github.com/dotnet/SqlClient/pull/4304))

- Hardened `SqlConnection` internal state transitions with `Interlocked.CompareExchange` guards.
([#4267](https://github.com/dotnet/SqlClient/pull/4267))

- Removed legacy connection-options inheritance from internal APIs and simplified `TryOpenConnection` / `TryReplaceConnection` / pool interfaces.
([#4235](https://github.com/dotnet/SqlClient/pull/4235),
[#4237](https://github.com/dotnet/SqlClient/pull/4237),
[#4261](https://github.com/dotnet/SqlClient/pull/4261),
[#4415](https://github.com/dotnet/SqlClient/pull/4415))

- Added the SQL Server 2025 `json` data type to the `DataTypes` schema table returned by `SqlConnection.GetSchema`.
([#3858](https://github.com/dotnet/SqlClient/pull/3858))

- Added async generic helpers to reduce sync/async duplication.
([#4334](https://github.com/dotnet/SqlClient/pull/4334))

- Use hardcoded LCID mappings when decoding strings.
([#4212](https://github.com/dotnet/SqlClient/pull/4212))

- Reduced allocations by skipping lock acquisition on `SqlErrorCollection` counters when no errors exist, and by avoiding stack-trace materialization on expected `null`-return paths.
([#4099](https://github.com/dotnet/SqlClient/pull/4099),
[#4102](https://github.com/dotnet/SqlClient/pull/4102),
[#4157](https://github.com/dotnet/SqlClient/pull/4157))

- Improved accuracy of `EnclaveDiffieHellmanInfo.Size`.
([#4346](https://github.com/dotnet/SqlClient/pull/4346))

- `SqlVector<float>` now serializes and deserializes multibyte values as little-endian explicitly.
([#3861](https://github.com/dotnet/SqlClient/pull/3861))

- Updated `Microsoft.Identity.Client` (and added `Microsoft.Identity.Client.Broker`) to `4.84.2` to enable WAM, and updated the bundled .NET 10 SDK to `10.0.300`.
([#4287](https://github.com/dotnet/SqlClient/pull/4287),
[#4288](https://github.com/dotnet/SqlClient/pull/4288))

- Re-shipped `Microsoft.Data.SqlClient.AlwaysEncrypted.AzureKeyVaultProvider`, `Microsoft.Data.SqlClient.Extensions.Azure`, `Microsoft.Data.SqlClient.Extensions.Abstractions`, and `Microsoft.Data.SqlClient.Internal.Logging` as `7.1.0-preview2` (version alignment only, no functional changes). See release notes for [AKV](release-notes/add-ons/AzureKeyVaultProvider/7.1/7.1.0-preview2.md), [Azure](release-notes/Extensions/Azure/7.1/7.1.0-preview2.md), [Abstractions](release-notes/Extensions/Abstractions/7.1/7.1.0-preview2.md), and [Logging](release-notes/Internal/Logging/7.1/7.1.0-preview2.md).

### Fixed

- Fixed a `NullReferenceException` in `SqlCommand.Cancel()` when the active connection has already been torn down.
([#4372](https://github.com/dotnet/SqlClient/pull/4372))

- Fixed Always Encrypted column master key signature verification incorrectly reusing cached results after a prior verification failure.
([#4339](https://github.com/dotnet/SqlClient/pull/4339))

- Fixed missing bounds checks on TDS token and feature-extension-acknowledgment data lengths that could allow a spoofing server to trigger unbounded allocations.
([#4340](https://github.com/dotnet/SqlClient/pull/4340))

- Fixed `SqlBulkCopy` failing in least-privilege environments.
([#4306](https://github.com/dotnet/SqlClient/pull/4306))

- Fixed Always Encrypted reads of `CekMdVersion` and `EkValueCount` to align with the TDS specification.
([#4240](https://github.com/dotnet/SqlClient/pull/4240))

- Fixed `LoginWithFailover` to validate parser state before continuing.
([#4140](https://github.com/dotnet/SqlClient/pull/4140))

- Fixed the SPN used during login to use the resolved port instead of the instance name when `Protocol=None` or `Protocol=Admin`.
([#4180](https://github.com/dotnet/SqlClient/pull/4180))

- Fixed a race in `SqlConnection.TryOpenInner` that could surface as `InvalidCastException`; the same race now returns a deterministic `InvalidOperationException`.
([#4179](https://github.com/dotnet/SqlClient/pull/4179))

- Fixed several `CancellationTokenSource` leaks across `SqlDataReader`, `SqlConnection` reconnect, `SqlCommand` reconnect timeout, and sequential-stream helpers.
([#4009](https://github.com/dotnet/SqlClient/pull/4009))

- Fixed server certificate documentation.
([#4408](https://github.com/dotnet/SqlClient/pull/4408))

### Removed

- **Breaking:** Removed SQL Server 7.0 and SQL Server 2000 support, along with the `TypeSystem.SQLServer2000` enum value and the `Type System Version=SQL Server 2000` connection-string value. Connection strings that specify this value now throw `ArgumentException` when the connection is opened. Supported values are `Latest`, `SQL Server 2005`, `SQL Server 2008`, and `SQL Server 2012`.
([#4015](https://github.com/dotnet/SqlClient/pull/4015))

## [Stable Release 7.0.2] - 2026-06-24

This update brings the following changes since the [7.0.1](release-notes/7.0/7.0.1.md) release.
Expand Down
16 changes: 8 additions & 8 deletions eng/pipelines/libraries/ci-build-variables.yml
Original file line number Diff line number Diff line change
Expand Up @@ -24,42 +24,42 @@ variables:

# Abstractions library assembly file version
- name: abstractionsAssemblyFileVersion
value: 1.1.0.$(assemblyBuildNumber)
value: 7.1.0.$(assemblyBuildNumber)

# Abstractions library NuGet package version
- name: abstractionsPackageVersion
value: 1.1.0-preview1ci$(Build.BuildNumber)
value: 7.1.0-preview2ci$(Build.BuildNumber)

# AKV provider assembly file version
- name: akvAssemblyFileVersion
value: 7.1.0.$(assemblyBuildNumber)

# AKV provider NuGet package version
- name: akvPackageVersion
value: 7.1.0-preview1ci$(Build.BuildNumber)
value: 7.1.0-preview2ci$(Build.BuildNumber)

# Azure library assembly file version
- name: azureAssemblyFileVersion
value: 1.1.0.$(assemblyBuildNumber)
value: 7.1.0.$(assemblyBuildNumber)

# Azure library NuGet package version
- name: azurePackageVersion
value: 1.1.0-preview1ci$(Build.BuildNumber)
value: 7.1.0-preview2ci$(Build.BuildNumber)

# Logging library assembly file version
- name: loggingAssemblyFileVersion
value: 1.1.0.$(assemblyBuildNumber)
value: 7.1.0.$(assemblyBuildNumber)

# Logging library NuGet package version
- name: loggingPackageVersion
value: 1.1.0-preview1ci$(Build.BuildNumber)
value: 7.1.0-preview2ci$(Build.BuildNumber)

# MDS library NuGet package version
# NOTE: This differs from the other structures! MdsVersions.props will deconstruct a provided
# package version and build an assembly version from it. If the build number is included
# before the "-" the build number will be appended again, generating an invalid file version.
- name: mdsPackageVersion
value: 7.1.0-preview1ci$(AssemblyBuildNumber)
value: 7.1.0-preview2ci$(AssemblyBuildNumber)

# SqlServer library NuGet package version
# NOTE: SqlServer's version props derive file version from the package version by appending the
Expand Down
26 changes: 13 additions & 13 deletions eng/pipelines/onebranch/variables/package-variables.yml
Original file line number Diff line number Diff line change
Expand Up @@ -53,13 +53,13 @@ variables:
value: 'drop_build_abstractions_build_package_Abstractions'

- name: abstractionsFileVersion
value: '1.0.0.$(_assemblyBuildNumber)'
value: '7.1.0.$(_assemblyBuildNumber)'

- name: abstractionsPackageVersion
${{ if parameters.isPreview }}:
value: '1.0.0-preview1.$(Build.BuildNumber)'
value: '7.1.0-preview2.$(Build.BuildNumber)'
${{ else }}:
value: '1.0.0'
value: '7.1.0'

# ------------------------------------------------------------------------
# AKV Provider Package
Expand All @@ -68,13 +68,13 @@ variables:
value: 'drop_build_addons_build_package_AkvProvider'

- name: akvProviderFileVersion
value: '7.0.0.$(_assemblyBuildNumber)'
value: '7.1.0.$(_assemblyBuildNumber)'
Comment thread
paulmedynski marked this conversation as resolved.

- name: akvProviderPackageVersion
${{ if parameters.isPreview }}:
value: '7.0.0-preview1.$(Build.BuildNumber)'
value: '7.1.0-preview2.$(Build.BuildNumber)'
${{ else }}:
value: '7.0.0'
value: '7.1.0'

# ------------------------------------------------------------------------
# Azure Package
Expand All @@ -83,13 +83,13 @@ variables:
value: 'drop_build_dependent_build_package_Azure'

- name: azureFileVersion
value: '1.0.0.$(_assemblyBuildNumber)'
value: '7.1.0.$(_assemblyBuildNumber)'

- name: azurePackageVersion
${{ if parameters.isPreview }}:
value: '1.0.0-preview1.$(Build.BuildNumber)'
value: '7.1.0-preview2.$(Build.BuildNumber)'
${{ else }}:
value: '1.0.0'
value: '7.1.0'

# ------------------------------------------------------------------------
# Logging Package
Expand All @@ -98,13 +98,13 @@ variables:
value: 'drop_build_independent_build_package_Logging'

- name: loggingFileVersion
value: '1.0.0.$(_assemblyBuildNumber)'
value: '7.1.0.$(_assemblyBuildNumber)'

- name: loggingPackageVersion
${{ if parameters.isPreview }}:
value: '1.0.0-preview1.$(Build.BuildNumber)'
value: '7.1.0-preview2.$(Build.BuildNumber)'
${{ else }}:
value: '1.0.0'
value: '7.1.0'

# ------------------------------------------------------------------------
# SqlClient Package
Expand All @@ -117,7 +117,7 @@ variables:

- name: sqlClientPackageVersion
${{ if parameters.isPreview }}:
value: '7.1.0-preview1.$(Build.BuildNumber)'
value: '7.1.0-preview2.$(Build.BuildNumber)'
${{ else }}:
value: '7.1.0'
Comment thread
priyankatiwari08 marked this conversation as resolved.

Expand Down
Loading
Loading