From 765dfc7fb28355c4061789f9f0486afa1412affc Mon Sep 17 00:00:00 2001
From: Paul Medynski <31868385+paulmedynski@users.noreply.github.com>
Date: Mon, 4 May 2026 15:27:30 -0300
Subject: [PATCH 01/19] Fix SqlServer sibling reference handling
---
Directory.Packages.props | 25 +++----
build.proj | 65 ++++++++++++++-----
.../Microsoft.Data.SqlClient.Samples.csproj | 8 ++-
.../Abstractions/src/Abstractions.csproj | 4 +-
.../Microsoft.Data.SqlClient.csproj | 9 ++-
.../ref/Microsoft.Data.SqlClient.csproj | 2 -
...icrosoft.Data.SqlClient.ManualTests.csproj | 9 ++-
.../SQL/UdtTest/UDTs/Address/Address.csproj | 7 +-
.../SQL/UdtTest/UDTs/Circle/Circle.csproj | 7 +-
.../SQL/UdtTest/UDTs/Shapes/Shapes.csproj | 5 +-
.../UdtTest/UDTs/Utf8String/Utf8String.csproj | 5 +-
.../Microsoft.Data.SqlClient.UnitTests.csproj | 12 +++-
12 files changed, 108 insertions(+), 50 deletions(-)
diff --git a/Directory.Packages.props b/Directory.Packages.props
index 62918f7d65..ef326d6b54 100644
--- a/Directory.Packages.props
+++ b/Directory.Packages.props
@@ -9,38 +9,29 @@
graphs with packages they never asked for.
-->
false
+
-
-
-
-
-
-
-
-
+
+
-
+
diff --git a/build.proj b/build.proj
index 971cfb12fa..8a3177c016 100644
--- a/build.proj
+++ b/build.proj
@@ -3,6 +3,14 @@
+
+
+
+
+
+
+
+
@@ -104,7 +112,7 @@
Default value: [blank]
Example: 1.0.1-dev2345
-->
-
+ $(AbstractionsPackageVersion)
-p:AbstractionsPackageVersion=$(PackageVersionAbstractions)
@@ -120,7 +128,7 @@
Default value: [blank]
Example: 1.0.1-dev2345
-->
-
+ $(AkvProviderPackageVersion)
-p:AkvProviderPackageVersion=$(PackageVersionAkvProvider)
@@ -136,7 +144,7 @@
Default value: [blank]
Example: 1.0.1-dev2345
-->
-
+ $(AzurePackageVersion)
-p:AzurePackageVersion=$(PackageVersionAzure)
@@ -161,7 +169,7 @@
Default value: [blank]
Example: 1.0.1-dev2345
-->
-
+ $(LoggingPackageVersion)
-p:LoggingPackageVersion=$(PackageVersionLogging)
@@ -185,7 +193,7 @@
Default value: [blank]
Example: 7.0.0-preview4
-->
-
+ $(SqlClientPackageVersion)
-p:SqlClientPackageVersion=$(PackageVersionSqlClient)
@@ -199,7 +207,7 @@
Default value: [blank]
Example: 1.0.0-dev2345
-->
-
+ $(SqlServerPackageVersion)
-p:SqlServerPackageVersion=$(PackageVersionSqlServer)
@@ -211,8 +219,9 @@
references (eg, Abstractions from SqlClient) will be made as project references. If
set to "Package", package references will be made instead. When running in
package mode, target versions can be specified via PackageVersion* build
- parameters. If these are not provided, the central feed version will be used
- instead (see Directory.Packages.props). When running in project mode, the
+ parameters. If these are not provided, defaults are evaluated from each
+ package's Versions.props and applied via Directory.Packages.props. When
+ running in project mode, the
dependencies will be built automatically.
Applies to: TestSqlClientFunctional, TestSqlClientManual
@@ -226,7 +235,6 @@
-p:ReferenceType=Package
-
-
+
+ PackAbstractions
+
+
"$(DotnetPath)dotnet" build "$(GenApiProjectPath)"
@@ -424,6 +435,7 @@
$(ReferenceTypeArgument)
$(PackageVersionAbstractionsArgument)
$(PackageVersionLoggingArgument)
+ $(PackageVersionSqlServerArgument)
$([System.Text.RegularExpressions.Regex]::Replace($(DotnetCommand), "\s+", " "))
@@ -434,7 +446,10 @@
-
+
+ PackAbstractions
+
+
"$(DotnetPath)dotnet" build $(SqlClientRefProjectPath)
@@ -459,7 +474,10 @@
-
+
+ PackAbstractions;PackLogging;PackSqlServer
+
+
"$(DotnetPath)dotnet" build $(SqlClientProjectPath)
@@ -476,6 +494,7 @@
$(ReferenceTypeArgument)
$(PackageVersionAbstractionsArgument)
$(PackageVersionLoggingArgument)
+ $(PackageVersionSqlServerArgument)
$([System.Text.RegularExpressions.Regex]::Replace($(DotnetCommand), "\s+", " "))
@@ -486,7 +505,10 @@
-
+
+ PackAbstractions;PackLogging;PackSqlServer
+
+
"$(DotnetPath)dotnet" build $(SqlClientProjectPath)
@@ -503,6 +525,7 @@
$(ReferenceTypeArgument)
$(PackageVersionAbstractionsArgument)
$(PackageVersionLoggingArgument)
+ $(PackageVersionSqlServerArgument)
$([System.Text.RegularExpressions.Regex]::Replace($(DotnetCommand), "\s+", " "))
@@ -657,7 +680,10 @@
-
+
+ PackSqlClient;PackLogging
+
+
"$(DotnetPath)dotnet" build "$(AkvProviderProjectPath)"
@@ -720,7 +746,10 @@
-
+
+ PackLogging
+
+
"$(DotnetPath)dotnet" build "$(AbstractionsProjectPath)"
@@ -807,7 +836,10 @@
-
+
+ PackAbstractions;PackLogging
+
+
"$(DotnetPath)dotnet" build "$(AzureProjectPath)"
@@ -970,6 +1002,7 @@
"$(DotnetPath)dotnet" pack $(SqlServerProjectPath)
-p:Configuration=$(Configuration)
+ -p:PackageOutputPath="$(PackagesDir)"
$(PackBuildArgument)
$(SigningKeyPathArgument)
diff --git a/doc/samples/Microsoft.Data.SqlClient.Samples.csproj b/doc/samples/Microsoft.Data.SqlClient.Samples.csproj
index c194fac4d0..c138adbd9c 100644
--- a/doc/samples/Microsoft.Data.SqlClient.Samples.csproj
+++ b/doc/samples/Microsoft.Data.SqlClient.Samples.csproj
@@ -14,7 +14,6 @@
-
@@ -22,6 +21,13 @@
+
+
+
+
+
diff --git a/src/Microsoft.Data.SqlClient.Extensions/Abstractions/src/Abstractions.csproj b/src/Microsoft.Data.SqlClient.Extensions/Abstractions/src/Abstractions.csproj
index 45acd55488..b86010f6b6 100644
--- a/src/Microsoft.Data.SqlClient.Extensions/Abstractions/src/Abstractions.csproj
+++ b/src/Microsoft.Data.SqlClient.Extensions/Abstractions/src/Abstractions.csproj
@@ -71,9 +71,9 @@
+ Condition="'$(ReferenceType)' != 'Package' " />
+ Condition="'$(ReferenceType)' == 'Package' " />
diff --git a/src/Microsoft.Data.SqlClient/notsupported/Microsoft.Data.SqlClient.csproj b/src/Microsoft.Data.SqlClient/notsupported/Microsoft.Data.SqlClient.csproj
index 9d3860476c..395ab7f8ff 100644
--- a/src/Microsoft.Data.SqlClient/notsupported/Microsoft.Data.SqlClient.csproj
+++ b/src/Microsoft.Data.SqlClient/notsupported/Microsoft.Data.SqlClient.csproj
@@ -123,6 +123,11 @@
Condition="'$(ReferenceType)' == 'Package'" />
+
+
+
+
@@ -156,7 +161,7 @@
-
+
@@ -170,7 +175,7 @@
-
+
diff --git a/src/Microsoft.Data.SqlClient/ref/Microsoft.Data.SqlClient.csproj b/src/Microsoft.Data.SqlClient/ref/Microsoft.Data.SqlClient.csproj
index 0b6282965d..ac8829a7c0 100644
--- a/src/Microsoft.Data.SqlClient/ref/Microsoft.Data.SqlClient.csproj
+++ b/src/Microsoft.Data.SqlClient/ref/Microsoft.Data.SqlClient.csproj
@@ -112,7 +112,6 @@
-
@@ -124,7 +123,6 @@
-
diff --git a/src/Microsoft.Data.SqlClient/tests/ManualTests/Microsoft.Data.SqlClient.ManualTests.csproj b/src/Microsoft.Data.SqlClient/tests/ManualTests/Microsoft.Data.SqlClient.ManualTests.csproj
index 71d0f0b0cb..1145fa4790 100644
--- a/src/Microsoft.Data.SqlClient/tests/ManualTests/Microsoft.Data.SqlClient.ManualTests.csproj
+++ b/src/Microsoft.Data.SqlClient/tests/ManualTests/Microsoft.Data.SqlClient.ManualTests.csproj
@@ -328,6 +328,13 @@
+
+
+
+
+
@@ -367,7 +374,6 @@
-
@@ -394,7 +400,6 @@
-
diff --git a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/UdtTest/UDTs/Address/Address.csproj b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/UdtTest/UDTs/Address/Address.csproj
index d481e4cca6..c98b9b3fae 100644
--- a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/UdtTest/UDTs/Address/Address.csproj
+++ b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/UdtTest/UDTs/Address/Address.csproj
@@ -1,4 +1,4 @@
-
+
Address
Address
@@ -16,6 +16,9 @@
-
+
+
diff --git a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/UdtTest/UDTs/Circle/Circle.csproj b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/UdtTest/UDTs/Circle/Circle.csproj
index 6066c1c751..db53171c6e 100644
--- a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/UdtTest/UDTs/Circle/Circle.csproj
+++ b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/UdtTest/UDTs/Circle/Circle.csproj
@@ -1,4 +1,4 @@
-
+
Circle
Circle
@@ -16,6 +16,9 @@
-
+
+
diff --git a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/UdtTest/UDTs/Shapes/Shapes.csproj b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/UdtTest/UDTs/Shapes/Shapes.csproj
index 67f26c9ae9..e115355bfe 100644
--- a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/UdtTest/UDTs/Shapes/Shapes.csproj
+++ b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/UdtTest/UDTs/Shapes/Shapes.csproj
@@ -16,6 +16,9 @@
-
+
+
diff --git a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/UdtTest/UDTs/Utf8String/Utf8String.csproj b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/UdtTest/UDTs/Utf8String/Utf8String.csproj
index aa1dd19dd2..02e0193f82 100644
--- a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/UdtTest/UDTs/Utf8String/Utf8String.csproj
+++ b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/UdtTest/UDTs/Utf8String/Utf8String.csproj
@@ -16,6 +16,9 @@
-
+
+
diff --git a/src/Microsoft.Data.SqlClient/tests/UnitTests/Microsoft.Data.SqlClient.UnitTests.csproj b/src/Microsoft.Data.SqlClient/tests/UnitTests/Microsoft.Data.SqlClient.UnitTests.csproj
index 8c59d27572..bed3b620bc 100644
--- a/src/Microsoft.Data.SqlClient/tests/UnitTests/Microsoft.Data.SqlClient.UnitTests.csproj
+++ b/src/Microsoft.Data.SqlClient/tests/UnitTests/Microsoft.Data.SqlClient.UnitTests.csproj
@@ -39,16 +39,25 @@
+
+
+
+
+
+
-
@@ -65,7 +74,6 @@
-
From a0a26da94b43da26014625a973acabe1b0f46a54 Mon Sep 17 00:00:00 2001
From: Paul Medynski <31868385+paulmedynski@users.noreply.github.com>
Date: Mon, 4 May 2026 18:26:40 -0300
Subject: [PATCH 02/19] Address Copilot review comments in PR 4259
---
build.proj | 2 +-
.../tests/UnitTests/Microsoft.Data.SqlClient.UnitTests.csproj | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/build.proj b/build.proj
index 8a3177c016..a95c06086c 100644
--- a/build.proj
+++ b/build.proj
@@ -399,7 +399,7 @@
the first step of this target.
-->
- PackAbstractions
+ PackAbstractions;PackSqlServer
diff --git a/src/Microsoft.Data.SqlClient/tests/UnitTests/Microsoft.Data.SqlClient.UnitTests.csproj b/src/Microsoft.Data.SqlClient/tests/UnitTests/Microsoft.Data.SqlClient.UnitTests.csproj
index bed3b620bc..37eac8e178 100644
--- a/src/Microsoft.Data.SqlClient/tests/UnitTests/Microsoft.Data.SqlClient.UnitTests.csproj
+++ b/src/Microsoft.Data.SqlClient/tests/UnitTests/Microsoft.Data.SqlClient.UnitTests.csproj
@@ -47,7 +47,7 @@
-
From f154c9b1d6812f0b37dd7a71cdd86e71e7383c33 Mon Sep 17 00:00:00 2001
From: Paul Medynski <31868385+paulmedynski@users.noreply.github.com>
Date: Tue, 5 May 2026 10:14:18 -0300
Subject: [PATCH 03/19] Resolve merge conflicts after rebase
---
.../src/Microsoft.Data.SqlClient.csproj | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/src/Microsoft.Data.SqlClient/src/Microsoft.Data.SqlClient.csproj b/src/Microsoft.Data.SqlClient/src/Microsoft.Data.SqlClient.csproj
index cd7fdb4b79..f2929b1203 100644
--- a/src/Microsoft.Data.SqlClient/src/Microsoft.Data.SqlClient.csproj
+++ b/src/Microsoft.Data.SqlClient/src/Microsoft.Data.SqlClient.csproj
@@ -173,10 +173,13 @@
$(SourceRevisionId)
$(NuspecProperties);COMMITID=$(CommitId)
+
+
+
+
<_AbstractionsPackageVersionTrimmed>$([System.String]::Copy('$(AbstractionsPackageVersion)').Trim())
<_LoggingPackageVersionTrimmed>$([System.String]::Copy('$(LoggingPackageVersion)').Trim())
-
Date: Mon, 11 May 2026 12:30:19 -0300
Subject: [PATCH 04/19] Fix package-mode local feed mirroring and
Versions.props duplicate imports
---
Directory.Packages.props | 13 ++
build.proj | 112 ++++++++++++++----
...waysEncrypted.AzureKeyVaultProvider.csproj | 2 +-
.../src/Versions.props | 4 +
.../Abstractions/src/Abstractions.csproj | 2 +-
.../Abstractions/src/Versions.props | 4 +
.../Azure/src/Azure.csproj | 2 +-
.../Azure/src/Versions.props | 4 +
.../Logging/src/Logging.csproj | 2 +-
.../Logging/src/Versions.props | 4 +
src/Microsoft.Data.SqlClient/Versions.props | 4 +
.../Microsoft.Data.SqlClient.csproj | 16 +--
.../ref/Microsoft.Data.SqlClient.csproj | 9 +-
.../src/Microsoft.Data.SqlClient.csproj | 2 +-
.../Microsoft.SqlServer.Server.csproj | 2 +-
src/Microsoft.SqlServer.Server/Versions.props | 4 +
16 files changed, 149 insertions(+), 37 deletions(-)
diff --git a/Directory.Packages.props b/Directory.Packages.props
index ef326d6b54..261b8edbb6 100644
--- a/Directory.Packages.props
+++ b/Directory.Packages.props
@@ -1,4 +1,17 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
true
-
-
-
-
-
-
-
-
@@ -112,7 +105,7 @@
Default value: [blank]
Example: 1.0.1-dev2345
-->
- $(AbstractionsPackageVersion)
+
-p:AbstractionsPackageVersion=$(PackageVersionAbstractions)
@@ -128,7 +121,7 @@
Default value: [blank]
Example: 1.0.1-dev2345
-->
- $(AkvProviderPackageVersion)
+
-p:AkvProviderPackageVersion=$(PackageVersionAkvProvider)
@@ -144,7 +137,7 @@
Default value: [blank]
Example: 1.0.1-dev2345
-->
- $(AzurePackageVersion)
+
-p:AzurePackageVersion=$(PackageVersionAzure)
@@ -169,7 +162,7 @@
Default value: [blank]
Example: 1.0.1-dev2345
-->
- $(LoggingPackageVersion)
+
-p:LoggingPackageVersion=$(PackageVersionLogging)
@@ -193,7 +186,7 @@
Default value: [blank]
Example: 7.0.0-preview4
-->
- $(SqlClientPackageVersion)
+
-p:SqlClientPackageVersion=$(PackageVersionSqlClient)
@@ -207,7 +200,7 @@
Default value: [blank]
Example: 1.0.0-dev2345
-->
- $(SqlServerPackageVersion)
+
-p:SqlServerPackageVersion=$(PackageVersionSqlServer)
@@ -216,13 +209,15 @@
ReferenceType
Applies to: BuildSqlClient, BuildSqlClientUnix, BuildSqlClientWindows
Description: Determines how to build SqlClient. If set to "Project", any cross-project
- references (eg, Abstractions from SqlClient) will be made as project references. If
- set to "Package", package references will be made instead. When running in
- package mode, target versions can be specified via PackageVersion* build
- parameters. If these are not provided, defaults are evaluated from each
- package's Versions.props and applied via Directory.Packages.props. When
- running in project mode, the
- dependencies will be built automatically.
+ references (eg, Abstractions from SqlClient) will be made as project
+ references. If set to "Package", package references will be made instead. When
+ running in package mode, target versions can be specified via PackageVersion*
+ build parameters. If these are not provided, the central feed version will be
+ used instead (see Directory.Packages.props). In package mode, all Pack*
+ targets also mirror their .nupkg/.snupkg output into the local NuGet feed
+ directory (packages/) so that downstream builds in the same invocation can
+ restore them without a separate feed publish step. When running in project
+ mode, the dependencies will be built automatically.
Applies to: TestSqlClientFunctional, TestSqlClientManual
Description: Determines whether to test against a project reference or a package version
@@ -235,6 +230,7 @@
-p:ReferenceType=Package
+
$(SqlClientSrcRoot)tests/FunctionalTests/Microsoft.Data.SqlClient.FunctionalTests.csproj
@@ -570,13 +567,24 @@
$(PackageVersionLoggingArgument)
- -p:PackageOutputPath="$(SqlClientArtifactRoot)/$(ReferenceType)-$(Configuration)"
+ -p:PackageOutputPath="$(SqlClientPackageArtifactRoot)"
$([System.Text.RegularExpressions.Regex]::Replace($(DotnetCommand), "\s+", " "))
+
+
+
+
+
+
+
@@ -677,6 +685,7 @@
$(RepoRoot)src/Microsoft.Data.SqlClient.AlwaysEncrypted.AzureKeyVaultProvider/
$(AkvProviderSrcRoot)src/Microsoft.Data.SqlClient.AlwaysEncrypted.AzureKeyVaultProvider.csproj
+ $(RepoRoot)artifacts/Microsoft.Data.SqlClient.AlwaysEncrypted.AzureKeyVaultProvider/$(Configuration)/
@@ -735,14 +744,27 @@
+
+
+
+
+
+
+
+
$(RepoRoot)src/Microsoft.Data.SqlClient.Extensions/Abstractions/
$(AbstractionsSrcRoot)src/Abstractions.csproj
$(AbstractionsSrcRoot)test/Abstractions.Test.csproj
+ $(RepoRoot)artifacts/Microsoft.Data.SqlClient.Extensions.Abstractions/$(Configuration)/
@@ -797,6 +819,17 @@
+
+
+
+
+
+
+
@@ -833,6 +866,7 @@
$(RepoRoot)src/Microsoft.Data.SqlClient.Extensions/Azure/
$(AzureSrcRoot)src/Azure.csproj
$(AzureSrcRoot)test/Azure.Test.csproj
+ $(RepoRoot)artifacts/Microsoft.Data.SqlClient.Extensions.Azure/$(Configuration)/
@@ -887,6 +921,17 @@
+
+
+
+
+
+
+
@@ -923,6 +968,7 @@
$(RepoRoot)src/Microsoft.Data.SqlClient.Internal/Logging/src/
$(LoggingSrcRoot)Logging.csproj
+ $(RepoRoot)artifacts/Microsoft.Data.SqlClient.Internal.Logging/$(Configuration)/
@@ -966,6 +1012,17 @@
+
+
+
+
+
+
+
@@ -1017,5 +1074,16 @@
+
+
+
+
+
+
+
diff --git a/src/Microsoft.Data.SqlClient.AlwaysEncrypted.AzureKeyVaultProvider/src/Microsoft.Data.SqlClient.AlwaysEncrypted.AzureKeyVaultProvider.csproj b/src/Microsoft.Data.SqlClient.AlwaysEncrypted.AzureKeyVaultProvider/src/Microsoft.Data.SqlClient.AlwaysEncrypted.AzureKeyVaultProvider.csproj
index 909e36df7f..77a70b349b 100644
--- a/src/Microsoft.Data.SqlClient.AlwaysEncrypted.AzureKeyVaultProvider/src/Microsoft.Data.SqlClient.AlwaysEncrypted.AzureKeyVaultProvider.csproj
+++ b/src/Microsoft.Data.SqlClient.AlwaysEncrypted.AzureKeyVaultProvider/src/Microsoft.Data.SqlClient.AlwaysEncrypted.AzureKeyVaultProvider.csproj
@@ -12,7 +12,7 @@
-
+
$(AkvProviderAssemblyVersion)
$(AkvProviderFileVersion)
diff --git a/src/Microsoft.Data.SqlClient.AlwaysEncrypted.AzureKeyVaultProvider/src/Versions.props b/src/Microsoft.Data.SqlClient.AlwaysEncrypted.AzureKeyVaultProvider/src/Versions.props
index 31f85b7da4..3e674c3fc4 100644
--- a/src/Microsoft.Data.SqlClient.AlwaysEncrypted.AzureKeyVaultProvider/src/Versions.props
+++ b/src/Microsoft.Data.SqlClient.AlwaysEncrypted.AzureKeyVaultProvider/src/Versions.props
@@ -13,6 +13,10 @@
NuGet package. It should be in the form: (Major).(Minor).(Patch)[-(Suffix)(BuildNumber)]
-->
+
+ true
+
+
-
+
$(AbstractionsAssemblyVersion)
$(AbstractionsFileVersion)
diff --git a/src/Microsoft.Data.SqlClient.Extensions/Abstractions/src/Versions.props b/src/Microsoft.Data.SqlClient.Extensions/Abstractions/src/Versions.props
index 14daeda570..9063996d7e 100644
--- a/src/Microsoft.Data.SqlClient.Extensions/Abstractions/src/Versions.props
+++ b/src/Microsoft.Data.SqlClient.Extensions/Abstractions/src/Versions.props
@@ -13,6 +13,10 @@
naming. It must be in the form: (Major).0.0.0
-->
+
+ true
+
+
-
+
$(AzureAssemblyVersion)
$(AzureFileVersion)
diff --git a/src/Microsoft.Data.SqlClient.Extensions/Azure/src/Versions.props b/src/Microsoft.Data.SqlClient.Extensions/Azure/src/Versions.props
index 3c4bb9dfac..948cc6c7fc 100644
--- a/src/Microsoft.Data.SqlClient.Extensions/Azure/src/Versions.props
+++ b/src/Microsoft.Data.SqlClient.Extensions/Azure/src/Versions.props
@@ -13,6 +13,10 @@
form: (Major).(Minor).(Patch).(BuildNumber)
-->
+
+ true
+
+
-
+
$(LoggingAssemblyVersion)
$(LoggingFileVersion)
diff --git a/src/Microsoft.Data.SqlClient.Internal/Logging/src/Versions.props b/src/Microsoft.Data.SqlClient.Internal/Logging/src/Versions.props
index eeb25b93ca..15e1d85de2 100644
--- a/src/Microsoft.Data.SqlClient.Internal/Logging/src/Versions.props
+++ b/src/Microsoft.Data.SqlClient.Internal/Logging/src/Versions.props
@@ -13,6 +13,10 @@
naming. It must be in the form: (Major).0.0.0
-->
+
+ true
+
+
+
+ true
+
+
-
+
$(SqlClientAssemblyVersion)
$(SqlClientFileVersion)
@@ -112,9 +112,9 @@
-
-
+
+
+
@@ -161,7 +163,6 @@
-
@@ -175,7 +176,6 @@
-
diff --git a/src/Microsoft.Data.SqlClient/ref/Microsoft.Data.SqlClient.csproj b/src/Microsoft.Data.SqlClient/ref/Microsoft.Data.SqlClient.csproj
index ac8829a7c0..989f94decb 100644
--- a/src/Microsoft.Data.SqlClient/ref/Microsoft.Data.SqlClient.csproj
+++ b/src/Microsoft.Data.SqlClient/ref/Microsoft.Data.SqlClient.csproj
@@ -11,7 +11,7 @@
-
+
$(SqlClientAssemblyVersion)
$(SqlClientFileVersion)
@@ -79,6 +79,13 @@
+
+
+
+
+
diff --git a/src/Microsoft.Data.SqlClient/src/Microsoft.Data.SqlClient.csproj b/src/Microsoft.Data.SqlClient/src/Microsoft.Data.SqlClient.csproj
index f2929b1203..0a97683d0d 100644
--- a/src/Microsoft.Data.SqlClient/src/Microsoft.Data.SqlClient.csproj
+++ b/src/Microsoft.Data.SqlClient/src/Microsoft.Data.SqlClient.csproj
@@ -50,7 +50,7 @@
-
+
$(SqlClientAssemblyVersion)
$(SqlClientFileVersion)
diff --git a/src/Microsoft.SqlServer.Server/Microsoft.SqlServer.Server.csproj b/src/Microsoft.SqlServer.Server/Microsoft.SqlServer.Server.csproj
index ead90d9eac..060024c239 100644
--- a/src/Microsoft.SqlServer.Server/Microsoft.SqlServer.Server.csproj
+++ b/src/Microsoft.SqlServer.Server/Microsoft.SqlServer.Server.csproj
@@ -6,7 +6,7 @@
-
+
$(SqlServerAssemblyVersion)
$(SqlServerFileVersion)
diff --git a/src/Microsoft.SqlServer.Server/Versions.props b/src/Microsoft.SqlServer.Server/Versions.props
index 0a342f9426..7be7913091 100644
--- a/src/Microsoft.SqlServer.Server/Versions.props
+++ b/src/Microsoft.SqlServer.Server/Versions.props
@@ -13,6 +13,10 @@
naming. It must be in the form: (Major).0.0.0
-->
+
+ true
+
+
-
+
False
+
-
-
-
-
-
+
+
-
-
+
+
+
+
+
diff --git a/src/Microsoft.Data.SqlClient/src/Microsoft.Data.SqlClient.csproj b/src/Microsoft.Data.SqlClient/src/Microsoft.Data.SqlClient.csproj
index 0a97683d0d..c64546ab96 100644
--- a/src/Microsoft.Data.SqlClient/src/Microsoft.Data.SqlClient.csproj
+++ b/src/Microsoft.Data.SqlClient/src/Microsoft.Data.SqlClient.csproj
@@ -175,7 +175,7 @@
$(NuspecProperties);COMMITID=$(CommitId)
-
+
<_AbstractionsPackageVersionTrimmed>$([System.String]::Copy('$(AbstractionsPackageVersion)').Trim())
<_LoggingPackageVersionTrimmed>$([System.String]::Copy('$(LoggingPackageVersion)').Trim())
diff --git a/src/Microsoft.Data.SqlClient/tests/UnitTests/Microsoft.Data.SqlClient.UnitTests.csproj b/src/Microsoft.Data.SqlClient/tests/UnitTests/Microsoft.Data.SqlClient.UnitTests.csproj
index 37eac8e178..82e900e54c 100644
--- a/src/Microsoft.Data.SqlClient/tests/UnitTests/Microsoft.Data.SqlClient.UnitTests.csproj
+++ b/src/Microsoft.Data.SqlClient/tests/UnitTests/Microsoft.Data.SqlClient.UnitTests.csproj
@@ -47,9 +47,10 @@
-
-
+
+
From d8e02fc3291d7f896ce6780fce9a5280df612b34 Mon Sep 17 00:00:00 2001
From: Paul Medynski <31868385+paulmedynski@users.noreply.github.com>
Date: Mon, 11 May 2026 13:05:35 -0300
Subject: [PATCH 06/19] Added missing SqlServer package version to Samples.
---
doc/Directory.Packages.props | 1 +
1 file changed, 1 insertion(+)
diff --git a/doc/Directory.Packages.props b/doc/Directory.Packages.props
index 2ead6c1757..d47f7e01b9 100644
--- a/doc/Directory.Packages.props
+++ b/doc/Directory.Packages.props
@@ -6,5 +6,6 @@
+
From 95e87f6e3f9faa45c5092e342e1dbf6cd3d9bd00 Mon Sep 17 00:00:00 2001
From: Paul Medynski <31868385+paulmedynski@users.noreply.github.com>
Date: Mon, 11 May 2026 13:35:30 -0300
Subject: [PATCH 07/19] Address remaining Copilot PR 4259 feedback
---
build.proj | 3 ++-
.../Abstractions/src/Abstractions.csproj | 4 ++--
.../notsupported/Microsoft.Data.SqlClient.csproj | 2 +-
3 files changed, 5 insertions(+), 4 deletions(-)
diff --git a/build.proj b/build.proj
index 9b24508442..86f39d6ebd 100644
--- a/build.proj
+++ b/build.proj
@@ -444,7 +444,7 @@
- PackAbstractions
+ PackAbstractions;PackSqlServer
@@ -461,6 +461,7 @@
$(ReferenceTypeArgument)
$(PackageVersionAbstractionsArgument)
+ $(PackageVersionSqlServerArgument)
$([System.Text.RegularExpressions.Regex]::Replace($(DotnetCommand), "\s+", " "))
diff --git a/src/Microsoft.Data.SqlClient.Extensions/Abstractions/src/Abstractions.csproj b/src/Microsoft.Data.SqlClient.Extensions/Abstractions/src/Abstractions.csproj
index 295b9ba419..74424c15c8 100644
--- a/src/Microsoft.Data.SqlClient.Extensions/Abstractions/src/Abstractions.csproj
+++ b/src/Microsoft.Data.SqlClient.Extensions/Abstractions/src/Abstractions.csproj
@@ -71,9 +71,9 @@
+ Condition="'$(ReferenceType)' != 'Package'" />
+ Condition="'$(ReferenceType)' == 'Package'" />
diff --git a/src/Microsoft.Data.SqlClient/notsupported/Microsoft.Data.SqlClient.csproj b/src/Microsoft.Data.SqlClient/notsupported/Microsoft.Data.SqlClient.csproj
index 0731132182..22f43a4b51 100644
--- a/src/Microsoft.Data.SqlClient/notsupported/Microsoft.Data.SqlClient.csproj
+++ b/src/Microsoft.Data.SqlClient/notsupported/Microsoft.Data.SqlClient.csproj
@@ -113,7 +113,7 @@
From 606a660ff279bc9b4d6af6359f66c26e882564f8 Mon Sep 17 00:00:00 2001
From: Paul Medynski <31868385+paulmedynski@users.noreply.github.com>
Date: Mon, 11 May 2026 15:21:43 -0300
Subject: [PATCH 08/19] Fix SqlServer pack output path and gate unsigned net462
UDT tests
---
build.proj | 6 +-
.../SqlServerStrongNameTestCondition.cs | 59 +++++++++++++++++++
.../FunctionalTests/SqlDataRecordTest.cs | 4 +-
.../SQL/UdtTest/SqlServerTypesTest.cs | 26 ++++++--
4 files changed, 86 insertions(+), 9 deletions(-)
create mode 100644 src/Microsoft.Data.SqlClient/tests/Common/SqlServerStrongNameTestCondition.cs
diff --git a/build.proj b/build.proj
index 86f39d6ebd..03994cf371 100644
--- a/build.proj
+++ b/build.proj
@@ -1031,6 +1031,7 @@
$(RepoRoot)src/Microsoft.SqlServer.Server/
$(SqlServerSrcRoot)Microsoft.SqlServer.Server.csproj
+ $(RepoRoot)artifacts/Microsoft.SqlServer.Server/$(Configuration)/
@@ -1060,7 +1061,6 @@
"$(DotnetPath)dotnet" pack $(SqlServerProjectPath)
-p:Configuration=$(Configuration)
- -p:PackageOutputPath="$(PackagesDir)"
$(PackBuildArgument)
$(SigningKeyPathArgument)
@@ -1078,8 +1078,8 @@
-
-
+
+
+/// Provides a shared xUnit conditional check for tests that depend on SQL Server UDT types.
+///
+///
+/// Why this exists: in PR and local project-reference builds, the Microsoft.SqlServer.Server
+/// assembly can be produced unsigned on .NET Framework when no signing key is available. Some UDT
+/// tests use Microsoft.SqlServer.Types (a publicly published NuGet package, not owned by
+/// us), which requires a strongly named Microsoft.SqlServer.Server assembly and fail with
+/// FileLoadException ( 0x80131044) when that requirement is not met.
+///
+/// This can also happen in package-based test runs when the consumed package was produced from an
+/// unsigned assembly (for example, package-mode restore from a local feed containing CI/dev
+/// artifacts), not only when using direct project references.
+///
+/// What this checks: on .NET Framework, it loads the UDT attribute type from
+/// Microsoft.SqlServer.Server and verifies that the assembly has a non-empty public key
+/// token (is strongly named). On .NET, this always returns because runtime
+/// strong-name validation is not enforced the same way.
+///
+/// When to use it: add this condition to tests that execute SQL Server UDT paths and are known to
+/// fail in unsigned net462 runs, regardless of whether the assembly comes from project references
+/// or locally produced packages.
+///
+public static class SqlServerStrongNameTestCondition
+{
+ ///
+ /// Gets whether SQL Server UDT tests are safe to run in the current runtime/signing context.
+ ///
+ public static bool IsUnsignedSqlServerAssemblyUsable
+ {
+ get
+ {
+ #if NETFRAMEWORK
+
+ Type udtAttributeType = Type.GetType(
+ "Microsoft.SqlServer.Server.SqlUserDefinedTypeAttribute, Microsoft.SqlServer.Server",
+ throwOnError: false);
+ if (udtAttributeType is null)
+ {
+ return false;
+ }
+
+ byte[] token = udtAttributeType.Assembly.GetName().GetPublicKeyToken();
+ return token is { Length: > 0 };
+
+ #else
+
+ return true;
+
+ #endif
+ }
+ }
+}
diff --git a/src/Microsoft.Data.SqlClient/tests/FunctionalTests/SqlDataRecordTest.cs b/src/Microsoft.Data.SqlClient/tests/FunctionalTests/SqlDataRecordTest.cs
index 0576a64eba..c11737babe 100644
--- a/src/Microsoft.Data.SqlClient/tests/FunctionalTests/SqlDataRecordTest.cs
+++ b/src/Microsoft.Data.SqlClient/tests/FunctionalTests/SqlDataRecordTest.cs
@@ -8,6 +8,7 @@
using System.Data;
using System.Data.SqlTypes;
using Microsoft.Data.SqlClient.Server;
+using Microsoft.Data.SqlClient.TestCommon;
using Microsoft.SqlServer.Types;
using Xunit;
@@ -332,7 +333,7 @@ public void GetChar_ThrowsNotSupported()
Assert.Throws(() => record.GetChar(0));
}
- [Theory]
+ [ConditionalTheory(typeof(SqlServerStrongNameTestCondition), nameof(SqlServerStrongNameTestCondition.IsUnsignedSqlServerAssemblyUsable))]
[MemberData(
nameof(GetUdtTypeTestData.Get),
MemberType = typeof(GetUdtTypeTestData),
@@ -350,7 +351,6 @@ public void GetUdt_ReturnsValue(Type udtType, object value, string serverTypeNam
Assert.Equal(value.ToString(), record.GetValue(0).ToString());
}
-
[Theory]
[MemberData(
nameof(GetXXXBadTypeTestData.Get),
diff --git a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/UdtTest/SqlServerTypesTest.cs b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/UdtTest/SqlServerTypesTest.cs
index 3719a09328..5b83a86eff 100644
--- a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/UdtTest/SqlServerTypesTest.cs
+++ b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/UdtTest/SqlServerTypesTest.cs
@@ -11,6 +11,7 @@
using System.IO;
using System.Linq;
using System.Text;
+using Microsoft.Data.SqlClient.TestCommon;
using Microsoft.SqlServer.Types;
using Xunit;
@@ -18,6 +19,23 @@ namespace Microsoft.Data.SqlClient.ManualTesting.Tests
{
public static class SqlServerTypesTest
{
+ ///
+ /// Aggregates all gating checks for SQL Server UDT tests into a single condition member.
+ ///
+ ///
+ /// and
+ /// accept condition member names from a single declaring type per attribute instance, and
+ /// the attribute is not declared with multiple-use support. We therefore cannot compose
+ /// conditions from both and
+ /// by stacking multiple
+ /// ConditionalFact/ConditionalTheory attributes on the same test.
+ /// This helper keeps the existing environment checks and the strong-name check in one place.
+ ///
+ private static bool IsSqlServerTypesUdtTestsEnabled =>
+ DataTestUtility.AreConnStringsSetup() &&
+ DataTestUtility.IsNotAzureSynapse() &&
+ SqlServerStrongNameTestCondition.IsUnsignedSqlServerAssemblyUsable;
+
private const string BuiltInUdtSelectQuery =
@"SELECT " +
@" hierarchyid::Parse('/1/1/3/') AS col0, " +
@@ -34,7 +52,7 @@ public static class SqlServerTypesTest
private const string HierarchyIdBytesHexString = "5ade";
// Synapse: Parse error at line: 1, column: 48: Incorrect syntax near 'hierarchyid'.
- [ConditionalFact(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup), nameof(DataTestUtility.IsNotAzureSynapse))]
+ [ConditionalFact(nameof(IsSqlServerTypesUdtTestsEnabled))]
public static void GetSchemaTableTest()
{
string db = new SqlConnectionStringBuilder(DataTestUtility.TCPConnectionString).InitialCatalog;
@@ -60,7 +78,7 @@ public static void GetSchemaTableTest()
}
// Synapse: Parse error at line: 1, column: 48: Incorrect syntax near 'hierarchyid'.
- [ConditionalFact(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup), nameof(DataTestUtility.IsNotAzureSynapse))]
+ [ConditionalFact(nameof(IsSqlServerTypesUdtTestsEnabled))]
public static void GetValueTest()
{
using (SqlConnection conn = new SqlConnection(DataTestUtility.TCPConnectionString))
@@ -218,7 +236,7 @@ void ActAndAssert(int index, string expectedHexString)
}
// Synapse: Parse error at line: 1, column: 41: Incorrect syntax near 'hierarchyid'.
- [ConditionalFact(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup), nameof(DataTestUtility.IsNotAzureSynapse))]
+ [ConditionalFact(nameof(IsSqlServerTypesUdtTestsEnabled))]
public static void TestUdtSchemaMetadata()
{
using (SqlConnection connection = new SqlConnection(DataTestUtility.TCPConnectionString))
@@ -372,7 +390,7 @@ private static string GetUdtName(Type udtClrType)
}
// Synapse: Parse error at line: 1, column: 8: Incorrect syntax near 'geometry'.
- [ConditionalFact(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup), nameof(DataTestUtility.IsNotAzureSynapse))]
+ [ConditionalFact(nameof(IsSqlServerTypesUdtTestsEnabled))]
public static void TestSqlServerTypesInsertAndRead()
{
string tableName = DataTestUtility.GetLongName("Type");
From 45bc085c467ec3dc6f841d201f5cf4f831bced26 Mon Sep 17 00:00:00 2001
From: Paul Medynski <31868385+paulmedynski@users.noreply.github.com>
Date: Tue, 12 May 2026 08:26:23 -0300
Subject: [PATCH 09/19] Added implicit usings to the Test.Common project.
---
.../tests/Common/Microsoft.Data.SqlClient.TestCommon.csproj | 2 ++
1 file changed, 2 insertions(+)
diff --git a/src/Microsoft.Data.SqlClient/tests/Common/Microsoft.Data.SqlClient.TestCommon.csproj b/src/Microsoft.Data.SqlClient/tests/Common/Microsoft.Data.SqlClient.TestCommon.csproj
index 3f014f9fbe..63a8f91954 100644
--- a/src/Microsoft.Data.SqlClient/tests/Common/Microsoft.Data.SqlClient.TestCommon.csproj
+++ b/src/Microsoft.Data.SqlClient/tests/Common/Microsoft.Data.SqlClient.TestCommon.csproj
@@ -2,6 +2,8 @@
Microsoft.Data.SqlClient.TestCommon
Microsoft.Data.SqlClient.TestCommon
+
+ enable
enable
@@ -333,11 +333,14 @@
+
+
+
@@ -350,16 +353,18 @@
@@ -1087,4 +1092,116 @@
DestinationFolder="$(PackagesDir)"
SkipUnchangedFiles="true" />
+
+
+
+
+
+
+ <_OsList>Windows_NT;Unix
+
+
+ <_OsValues Include="$(_OsList)" />
+
+
+
+
+ <_DotnetArguments>
+ -p:Configuration=$(Configuration)
+ -p:TrimDocs=false
+
+
+ $(BuildNumberArgument)
+ $(BuildSuffixArgument)
+
+
+ $(ReferenceTypeArgument)
+ $(PackageVersionAbstractionsArgument)
+ $(PackageVersionAkvProviderArgument)
+ $(PackageVersionAzureArgument)
+ $(PackageVersionLoggingArgument)
+ $(PackageVersionSqlClientArgument)
+ $(PackageVersionSqlServerArgument)
+
+
+ <_DotnetArguments>$([System.Text.RegularExpressions.Regex]::Replace($(_DotnetArguments), "\s+", " "))
+
+
+
+
+ $(RepoRoot)src/Microsoft.Data.SqlClient.Extensions/Abstractions/test/Abstractions.Test.csproj
+ $(RepoRoot)src/Microsoft.Data.SqlClient/tests/UnitTests/Microsoft.Data.SqlClient.UnitTests.csproj
+ $(RepoRoot)src/Microsoft.Data.SqlClient/tests/FunctionalTests/Microsoft.Data.SqlClient.FunctionalTests.csproj
+ $(RepoRoot)src/Microsoft.Data.SqlClient/tests/ManualTests/Microsoft.Data.SqlClient.ManualTests.csproj
+ $(RepoRoot)src/Microsoft.Data.SqlClient/tests/PerformanceTests/Microsoft.Data.SqlClient.PerformanceTests.csproj
+ $(RepoRoot)src/Microsoft.Data.SqlClient/tests/StressTests/SqlClient.Stress.Runner/SqlClient.Stress.Runner.csproj
+ $(RepoRoot)src/Microsoft.Data.SqlClient.Extensions/Azure/test/Azure.Test.csproj
+
+ $(RepoRoot)doc/samples/Microsoft.Data.SqlClient.Samples.csproj
+
+ $(RepoRoot)tools/GenAPI/Microsoft.DotNet.GenAPI/Microsoft.DotNet.GenAPI.csproj
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Directory.Build.props b/src/Directory.Build.props
index e760ebe9f3..88ecffd4b2 100644
--- a/src/Directory.Build.props
+++ b/src/Directory.Build.props
@@ -1,5 +1,5 @@
-
+
+ Condition="'$(TrimDocs)' != 'false' AND '$(IsCrossTargetingBuild)' != 'true' AND '$(GenerateDocumentationFile)' == 'true'">
powershell.exe
diff --git a/src/Microsoft.Data.SqlClient/tests/ManualTests/Microsoft.Data.SqlClient.ManualTesting.Tests.ruleset b/src/Microsoft.Data.SqlClient/tests/ManualTests/Microsoft.Data.SqlClient.ManualTesting.Tests.ruleset
index 153e4717db..eeefbfdaaf 100644
--- a/src/Microsoft.Data.SqlClient/tests/ManualTests/Microsoft.Data.SqlClient.ManualTesting.Tests.ruleset
+++ b/src/Microsoft.Data.SqlClient/tests/ManualTests/Microsoft.Data.SqlClient.ManualTesting.Tests.ruleset
@@ -1,5 +1,5 @@
-
+
@@ -71,4 +71,4 @@
-
\ No newline at end of file
+
diff --git a/tools/props/AssemblyInfo.props b/tools/props/AssemblyInfo.props
index 344862fec4..0cbd62f346 100644
--- a/tools/props/AssemblyInfo.props
+++ b/tools/props/AssemblyInfo.props
@@ -1,5 +1,5 @@
-
+
Microsoft.Data.SqlClient
Microsoft
diff --git a/tools/props/AssemblyRef.props b/tools/props/AssemblyRef.props
index e27f711eb5..b407db8084 100644
--- a/tools/props/AssemblyRef.props
+++ b/tools/props/AssemblyRef.props
@@ -1,5 +1,5 @@
-
+
"Microsoft.VSDesigner, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
"System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
diff --git a/tools/targets/RepositoryInfo.targets b/tools/targets/RepositoryInfo.targets
index dec4f95206..a439809a67 100644
--- a/tools/targets/RepositoryInfo.targets
+++ b/tools/targets/RepositoryInfo.targets
@@ -35,6 +35,6 @@ file to you under the MIT license. -->
$(_TranslateUrlPattern), $(_TranslateUrlReplacement)))
-
+
From 2742b83af211190c78d3c07e0bf968b958f6f944 Mon Sep 17 00:00:00 2001
From: Paul Medynski <31868385+paulmedynski@users.noreply.github.com>
Date: Wed, 13 May 2026 11:14:50 -0300
Subject: [PATCH 11/19] Extract Versioning.props and fix PR review feedback
- Extract BuildNumber/FileVersionBuildNumber into src/Versioning.props so
that FileVersionBuildNumber is defined before any Versions.props runs,
regardless of Package vs Project mode.
- Import Versioning.props from Directory.Packages.props (Package mode)
and Directory.Build.props (Project mode, with guard).
- Remove unnecessary blank line in Directory.Packages.props.
- Fix 'Setup of list' comment wording in build.proj.
- Add 'AKV Provider has no tests' note in build.proj BuildTests target.
---
Directory.Packages.props | 2 +-
build.proj | 5 ++++-
src/Directory.Build.props | 26 +++++---------------------
src/Versioning.props | 30 ++++++++++++++++++++++++++++++
4 files changed, 40 insertions(+), 23 deletions(-)
create mode 100644 src/Versioning.props
diff --git a/Directory.Packages.props b/Directory.Packages.props
index 31cbc6389e..04ab5ffb6f 100644
--- a/Directory.Packages.props
+++ b/Directory.Packages.props
@@ -4,6 +4,7 @@
+
@@ -22,7 +23,6 @@
graphs with packages they never asked for.
-->
false
-
diff --git a/build.proj b/build.proj
index e1e4d06ad7..eb13202c9f 100644
--- a/build.proj
+++ b/build.proj
@@ -1096,7 +1096,7 @@
-
+
<_OsList>Windows_NT;Unix
@@ -1188,6 +1188,9 @@
+
+
+
diff --git a/src/Directory.Build.props b/src/Directory.Build.props
index 88ecffd4b2..ce818e03e5 100644
--- a/src/Directory.Build.props
+++ b/src/Directory.Build.props
@@ -34,28 +34,12 @@
-
-
- 0
- $(BuildNumber.Split('.')[0])
-
+
diff --git a/src/Versioning.props b/src/Versioning.props
new file mode 100644
index 0000000000..ceb71b5578
--- /dev/null
+++ b/src/Versioning.props
@@ -0,0 +1,30 @@
+
+
+
+ true
+
+
+ 0
+ $(BuildNumber.Split('.')[0])
+
+
From de84654f16a0c13d6877e71619ec58008853b09a Mon Sep 17 00:00:00 2001
From: Paul Medynski <31868385+paulmedynski@users.noreply.github.com>
Date: Wed, 13 May 2026 13:42:54 -0300
Subject: [PATCH 12/19] Fix MSB4011: remove duplicate Versioning.props import
Directory.Build.props evaluates before Directory.Packages.props, so import
Versioning.props unconditionally from Directory.Build.props only. Remove the
import from Directory.Packages.props and the now-unnecessary guard flag.
---
Directory.Packages.props | 1 -
src/Directory.Build.props | 6 +++---
src/Versioning.props | 8 +++-----
3 files changed, 6 insertions(+), 9 deletions(-)
diff --git a/Directory.Packages.props b/Directory.Packages.props
index 04ab5ffb6f..f47d7ea9ac 100644
--- a/Directory.Packages.props
+++ b/Directory.Packages.props
@@ -4,7 +4,6 @@
-
diff --git a/src/Directory.Build.props b/src/Directory.Build.props
index ce818e03e5..d12d92f3db 100644
--- a/src/Directory.Build.props
+++ b/src/Directory.Build.props
@@ -36,10 +36,10 @@
-
+
diff --git a/src/Versioning.props b/src/Versioning.props
index ceb71b5578..344fc146a5 100644
--- a/src/Versioning.props
+++ b/src/Versioning.props
@@ -2,13 +2,11 @@
- true
-
-
+
+
+ 0
+ $(BuildNumber.Split('.')[0])
+
diff --git a/src/Versioning.props b/src/Versioning.props
deleted file mode 100644
index 344fc146a5..0000000000
--- a/src/Versioning.props
+++ /dev/null
@@ -1,28 +0,0 @@
-
-
-
-
- 0
- $(BuildNumber.Split('.')[0])
-
-
From d112e1b0aba1780a9985b61e2fe98407da9f2197 Mon Sep 17 00:00:00 2001
From: Paul Medynski <31868385+paulmedynski@users.noreply.github.com>
Date: Wed, 13 May 2026 14:07:48 -0300
Subject: [PATCH 14/19] Tokenize SqlServer.Server version in nuspec and fix
BuildTests
- Replace hardcoded SqlServer.Server 1.0.0 dependency in nuspec with
$SqlServerPackageVersion$ token, matching Abstractions/Logging pattern.
- Import SqlServer Versions.props in csproj for version resolution during pack.
- Add SqlServerPackageVersion validation and token expansion in
PrepareSqlClientPackNuspec target.
- Pass PackageVersionSqlServer through build.proj PackSqlClient target.
- Fix BuildTests to not pass ReferenceType to UnitTests (project-only).
---
build.proj | 7 ++++---
.../src/Microsoft.Data.SqlClient.csproj | 12 +++++++++---
.../src/Microsoft.Data.SqlClient.nuspec | 6 +++---
3 files changed, 16 insertions(+), 9 deletions(-)
diff --git a/build.proj b/build.proj
index eb13202c9f..2d3b8af855 100644
--- a/build.proj
+++ b/build.proj
@@ -571,6 +571,7 @@
$(ReferenceTypeArgument)
$(PackageVersionAbstractionsArgument)
$(PackageVersionLoggingArgument)
+ $(PackageVersionSqlServerArgument)
-p:PackageOutputPath="$(SqlClientPackageArtifactRoot)"
@@ -1159,10 +1160,10 @@
-
-
+
+
+ Command=""$(DotnetPath)dotnet" build $(UnitTestsProjectPath) -p:Configuration=$(Configuration) -p:OS=%(_OsValues.Identity)" />
diff --git a/src/Microsoft.Data.SqlClient/src/Microsoft.Data.SqlClient.csproj b/src/Microsoft.Data.SqlClient/src/Microsoft.Data.SqlClient.csproj
index c64546ab96..b2d61111d5 100644
--- a/src/Microsoft.Data.SqlClient/src/Microsoft.Data.SqlClient.csproj
+++ b/src/Microsoft.Data.SqlClient/src/Microsoft.Data.SqlClient.csproj
@@ -87,6 +87,7 @@
$(RepoRoot)/src/Microsoft.Data.SqlClient.Internal/Logging/src/Logging.csproj
$(RepoRoot)/src/Microsoft.Data.SqlClient.Extensions/Abstractions/src/Versions.props
$(RepoRoot)/src/Microsoft.Data.SqlClient.Internal/Logging/src/Versions.props
+ $(RepoRoot)/src/Microsoft.SqlServer.Server/Versions.props
@@ -129,13 +130,15 @@
+
- <_SqlClientPackNuspecExpandedText>$([System.IO.File]::ReadAllText('$(SqlClientPackNuspecTemplatePath)').Replace('$AbstractionsPackageVersion$','$(AbstractionsPackageVersion)').Replace('$LoggingPackageVersion$','$(LoggingPackageVersion)'))
+ <_SqlClientPackNuspecExpandedText>$([System.IO.File]::ReadAllText('$(SqlClientPackNuspecTemplatePath)').Replace('$AbstractionsPackageVersion$','$(AbstractionsPackageVersion)').Replace('$LoggingPackageVersion$','$(LoggingPackageVersion)').Replace('$SqlServerPackageVersion$','$(SqlServerPackageVersion)'))
-
+
@@ -73,7 +73,7 @@
-
+
@@ -85,7 +85,7 @@
-
+
From bccd9c543a7ca755f57b03c38d99f3bbed73d9c5 Mon Sep 17 00:00:00 2001
From: Paul Medynski <31868385+paulmedynski@users.noreply.github.com>
Date: Wed, 13 May 2026 14:14:55 -0300
Subject: [PATCH 15/19] Quote project paths in
BuildTests/BuildSamples/BuildTools
Protect against spaces in checkout paths by quoting all project path
properties in Exec commands, matching the pattern used by other targets.
---
build.proj | 18 +++++++++---------
1 file changed, 9 insertions(+), 9 deletions(-)
diff --git a/build.proj b/build.proj
index 2d3b8af855..da63bc499f 100644
--- a/build.proj
+++ b/build.proj
@@ -1158,37 +1158,37 @@
+ Command=""$(DotnetPath)dotnet" build "$(AbstractionsTestsProjectPath)" $(_DotnetArguments)" />
+ Command=""$(DotnetPath)dotnet" build "$(UnitTestsProjectPath)" -p:Configuration=$(Configuration) -p:OS=%(_OsValues.Identity)" />
+ Command=""$(DotnetPath)dotnet" build "$(FunctionalTestsProjectPath)" $(_DotnetArguments) -p:OS=%(_OsValues.Identity)" />
+ Command=""$(DotnetPath)dotnet" build "$(ManualTestsProjectPath)" $(_DotnetArguments) -p:OS=%(_OsValues.Identity)" />
+ Command=""$(DotnetPath)dotnet" build "$(PerformanceTestsProjectPath)" $(_DotnetArguments) -p:OS=%(_OsValues.Identity)" />
+ Command=""$(DotnetPath)dotnet" build "$(StressTestsProjectPath)" $(_DotnetArguments) -p:OS=%(_OsValues.Identity)" />
+ Command=""$(DotnetPath)dotnet" build "$(AzureTestsProjectPath)" $(_DotnetArguments) -p:OS=%(_OsValues.Identity)" />
@@ -1198,14 +1198,14 @@
+ Command=""$(DotnetPath)dotnet" build "$(SamplesProjectPath)" $(_DotnetArguments)" />
+ Command=""$(DotnetPath)dotnet" build "$(GenApiProjectPath)" $(_DotnetArguments)" />
From 02ec440e842afd5019636c8d2f35d1396109c064 Mon Sep 17 00:00:00 2001
From: Paul Medynski <31868385+paulmedynski@users.noreply.github.com>
Date: Wed, 13 May 2026 15:15:06 -0300
Subject: [PATCH 16/19] Download SqlServer artifacts in Azure Package test jobs
The Azure test jobs restore SqlClient as a NuGet package, which has a
transitive dependency on Microsoft.SqlServer.Server. In Package mode
the CI-versioned SqlServer package (e.g. 1.0.0-ci13309) only exists as
a pipeline artifact, so we must download it to packages/ before restore.
Add sqlServerArtifactsName parameter and DownloadPipelineArtifact step
to test-azure-package-ci-job.yml, pass it through the stage template,
and add build_sqlserver_package_stage to the Azure stage dependencies
in ci-core.
---
eng/pipelines/dotnet-sqlclient-ci-core.yml | 4 +++-
.../jobs/test-azure-package-ci-job.yml | 18 ++++++++++++++++++
.../stages/build-azure-package-ci-stage.yml | 13 +++++++++++++
3 files changed, 34 insertions(+), 1 deletion(-)
diff --git a/eng/pipelines/dotnet-sqlclient-ci-core.yml b/eng/pipelines/dotnet-sqlclient-ci-core.yml
index c8181aff5a..912b041627 100644
--- a/eng/pipelines/dotnet-sqlclient-ci-core.yml
+++ b/eng/pipelines/dotnet-sqlclient-ci-core.yml
@@ -206,16 +206,18 @@ stages:
buildConfiguration: ${{ parameters.buildConfiguration }}
debug: ${{ parameters.debug }}
# When building via packages, we must depend on the Abstractions, Logging,
- # and MDS packages.
+ # SqlServer, and MDS packages.
${{ if eq(parameters.referenceType, 'Package') }}:
additionalDependsOn:
- build_abstractions_package_stage
- build_logging_package_stage
+ - build_sqlserver_package_stage
- build_sqlclient_package_stage
dotnetVerbosity: ${{ parameters.dotnetVerbosity }}
mdsArtifactsName: $(mdsArtifactsName)
mdsPackageVersion: $(mdsPackageVersion)
referenceType: ${{ parameters.referenceType }}
+ sqlServerArtifactsName: $(sqlServerArtifactsName)
# Verify that all NuGet packages comply with Microsoft metadata requirements.
# This runs on a Windows agent after all packages have been built and
diff --git a/eng/pipelines/jobs/test-azure-package-ci-job.yml b/eng/pipelines/jobs/test-azure-package-ci-job.yml
index cd9b87e103..373a35fe94 100644
--- a/eng/pipelines/jobs/test-azure-package-ci-job.yml
+++ b/eng/pipelines/jobs/test-azure-package-ci-job.yml
@@ -79,6 +79,14 @@ parameters:
- name: mdsPackageVersion
type: string
+ # The name of the SqlServer pipeline artifacts to download.
+ #
+ # This is used when the referenceType is 'Package'. MDS depends on
+ # SqlServer.Server, so the package must be available for transitive restore.
+ - name: sqlServerArtifactsName
+ type: string
+ default: SqlServer.Artifacts
+
# The list of .NET Framework runtimes to test against.
- name: netFrameworkRuntimes
type: object
@@ -208,6 +216,16 @@ jobs:
artifactName: ${{ parameters.mdsArtifactsName }}
targetPath: $(Build.SourcesDirectory)/packages
+ # Download the SqlServer package artifacts into packages/.
+ #
+ # MDS depends on SqlServer.Server, so the package must be available for
+ # transitive restore.
+ - task: DownloadPipelineArtifact@2
+ displayName: Download SqlServer Package Artifacts
+ inputs:
+ artifactName: ${{ parameters.sqlServerArtifactsName }}
+ targetPath: $(Build.SourcesDirectory)/packages
+
# Install the .NET SDK and Runtimes.
- template: /eng/pipelines/steps/install-dotnet.yml@self
parameters:
diff --git a/eng/pipelines/stages/build-azure-package-ci-stage.yml b/eng/pipelines/stages/build-azure-package-ci-stage.yml
index 3b57ce8c3b..b71cd75cda 100644
--- a/eng/pipelines/stages/build-azure-package-ci-stage.yml
+++ b/eng/pipelines/stages/build-azure-package-ci-stage.yml
@@ -114,6 +114,14 @@ parameters:
- name: mdsPackageVersion
type: string
+ # The name of the SqlServer pipeline artifacts to download.
+ #
+ # This is used when the referenceType is 'Package'. MDS depends on
+ # SqlServer.Server, so the package must be available for transitive restore.
+ - name: sqlServerArtifactsName
+ type: string
+ default: SqlServer.Artifacts
+
# The C# project reference type to use when building and packing the packages.
- name: referenceType
type: string
@@ -154,6 +162,7 @@ stages:
jobNameSuffix: linux
mdsArtifactsName: ${{ parameters.mdsArtifactsName }}
mdsPackageVersion: ${{ parameters.mdsPackageVersion }}
+ sqlServerArtifactsName: ${{ parameters.sqlServerArtifactsName }}
netFrameworkRuntimes: []
netRuntimes: [net8.0, net9.0, net10.0]
poolName: ${{ parameters.azurePoolName }}
@@ -172,6 +181,7 @@ stages:
jobNameSuffix: linux_integration
mdsArtifactsName: ${{ parameters.mdsArtifactsName }}
mdsPackageVersion: ${{ parameters.mdsPackageVersion }}
+ sqlServerArtifactsName: ${{ parameters.sqlServerArtifactsName }}
netFrameworkRuntimes: []
netRuntimes: [net8.0, net9.0, net10.0]
poolName: ${{ parameters.adoPoolName }}
@@ -199,6 +209,7 @@ stages:
jobNameSuffix: windows
mdsArtifactsName: ${{ parameters.mdsArtifactsName }}
mdsPackageVersion: ${{ parameters.mdsPackageVersion }}
+ sqlServerArtifactsName: ${{ parameters.sqlServerArtifactsName }}
netFrameworkRuntimes: [net462]
netRuntimes: [net8.0, net9.0, net10.0]
poolName: ${{ parameters.azurePoolName }}
@@ -217,6 +228,7 @@ stages:
jobNameSuffix: windows_integration
mdsArtifactsName: ${{ parameters.mdsArtifactsName }}
mdsPackageVersion: ${{ parameters.mdsPackageVersion }}
+ sqlServerArtifactsName: ${{ parameters.sqlServerArtifactsName }}
netFrameworkRuntimes: [net462]
netRuntimes: [net8.0, net9.0, net10.0]
poolName: ${{ parameters.adoPoolName }}
@@ -253,6 +265,7 @@ stages:
jobNameSuffix: macos
mdsArtifactsName: ${{ parameters.mdsArtifactsName }}
mdsPackageVersion: ${{ parameters.mdsPackageVersion }}
+ sqlServerArtifactsName: ${{ parameters.sqlServerArtifactsName }}
netFrameworkRuntimes: []
netRuntimes: [net8.0, net9.0, net10.0]
poolName: ${{ parameters.azurePoolName }}
From a3f92e8f8e1aa4ef38e17a41e8cf6904b15cd8d1 Mon Sep 17 00:00:00 2001
From: Paul Medynski <31868385+paulmedynski@users.noreply.github.com>
Date: Wed, 13 May 2026 15:36:26 -0300
Subject: [PATCH 17/19] Plumb SqlServerPackageVersion through all build and
test pipelines
Add sqlServerPackageVersion and sqlServerArtifactsName parameters to
every pipeline layer that already forwarded Abstractions/Logging versions
but was missing SqlServer:
Pipeline build/pack path:
- ci-project-build-step.yml: forward to Build Driver and AKV Provider
- ci-build-nugets-job.yml: add param, download artifact, forward to
build steps and PackSqlClient
- build-sqlclient-package-ci-stage.yml: add params, forward to job
- dotnet-sqlclient-ci-core.yml: pass to MDS stage, add
build_sqlserver_package_stage dependency
Pipeline test path:
- run-all-tests-step.yml: add param, pass -p:PackageVersionSqlServer
to all 14 MSBuild test invocations
- ci-run-tests-job.yml: add params, download SqlServer artifact,
forward to run-all-tests-step
- ci-run-tests-stage.yml: add params, forward to both job invocations
- dotnet-sqlclient-ci-core.yml: pass to test stage, add
build_sqlserver_package_stage dependency
build.proj targets:
- TestSqlClientFunctional, TestSqlClientManual, BuildAkvProvider,
PackAkvProvider, TestAzure: add $(PackageVersionSqlServerArgument)
---
build.proj | 10 ++++++++--
.../templates/jobs/ci-build-nugets-job.yml | 19 +++++++++++++++++++
.../templates/jobs/ci-run-tests-job.yml | 18 ++++++++++++++++++
.../templates/stages/ci-run-tests-stage.yml | 14 ++++++++++++++
.../templates/steps/ci-project-build-step.yml | 7 +++++++
.../templates/steps/run-all-tests-step.yml | 16 ++++++++++++++++
eng/pipelines/dotnet-sqlclient-ci-core.yml | 12 +++++++++---
.../build-sqlclient-package-ci-stage.yml | 12 ++++++++++++
8 files changed, 103 insertions(+), 5 deletions(-)
diff --git a/build.proj b/build.proj
index da63bc499f..516cd9e5f9 100644
--- a/build.proj
+++ b/build.proj
@@ -620,6 +620,7 @@
$(PackageVersionAbstractionsArgument)
$(PackageVersionLoggingArgument)
$(PackageVersionSqlClientArgument)
+ $(PackageVersionSqlServerArgument)
$([System.Text.RegularExpressions.Regex]::Replace($(DotnetCommand), "\s+", " "))
@@ -651,6 +652,7 @@
$(PackageVersionAbstractionsArgument)
$(PackageVersionLoggingArgument)
$(PackageVersionSqlClientArgument)
+ $(PackageVersionSqlServerArgument)
$([System.Text.RegularExpressions.Regex]::Replace($(DotnetCommand), "\s+", " "))
@@ -716,6 +718,7 @@
$(PackageVersionAbstractionsArgument)
$(PackageVersionLoggingArgument)
$(PackageVersionSqlClientArgument)
+ $(PackageVersionSqlServerArgument)
$([System.Text.RegularExpressions.Regex]::Replace($(DotnetCommand), "\s+", " "))
@@ -744,6 +747,7 @@
$(PackageVersionAbstractionsArgument)
$(PackageVersionLoggingArgument)
$(PackageVersionSqlClientArgument)
+ $(PackageVersionSqlServerArgument)
$([System.Text.RegularExpressions.Regex]::Replace($(DotnetCommand), "\s+", " "))
@@ -959,14 +963,16 @@
$(ReferenceTypeArgument)
-
+ $(PackageVersionAbstractionsArgument)
+ $(PackageVersionLoggingArgument)
$(PackageVersionSqlClientArgument)
+ $(PackageVersionSqlServerArgument)
$([System.Text.RegularExpressions.Regex]::Replace($(DotnetCommand), "\s+", " "))
-
+
diff --git a/eng/pipelines/common/templates/jobs/ci-build-nugets-job.yml b/eng/pipelines/common/templates/jobs/ci-build-nugets-job.yml
index 8d051e5167..1bcfc9beb3 100644
--- a/eng/pipelines/common/templates/jobs/ci-build-nugets-job.yml
+++ b/eng/pipelines/common/templates/jobs/ci-build-nugets-job.yml
@@ -77,6 +77,16 @@ parameters:
- name: akvPackageVersion
type: string
+ # The version of the SqlServer package to depend on when referenceType is 'Package'.
+ - name: sqlServerPackageVersion
+ type: string
+ default: $(sqlServerPackageVersion)
+
+ # The name of the SqlServer pipeline artifact to download when referenceType is 'Package'.
+ - name: sqlServerArtifactsName
+ type: string
+ default: SqlServer.Artifacts
+
jobs:
- job: build_mds_akv_packages_job
displayName: Build MDS & AKV Packages
@@ -115,6 +125,12 @@ jobs:
artifactName: ${{ parameters.loggingArtifactsName }}
targetPath: $(localFeedPath)
+ - task: DownloadPipelineArtifact@2
+ displayName: Download SqlServer Package Artifacts
+ inputs:
+ artifactName: ${{ parameters.sqlServerArtifactsName }}
+ targetPath: $(localFeedPath)
+
# Install the .NET SDK.
- template: /eng/pipelines/steps/install-dotnet.yml@self
@@ -139,6 +155,7 @@ jobs:
build: MDS
abstractionsPackageVersion: ${{parameters.abstractionsPackageVersion}}
loggingPackageVersion: ${{ parameters.loggingPackageVersion }}
+ sqlServerPackageVersion: ${{ parameters.sqlServerPackageVersion }}
- task: DotNetCoreCLI@2
displayName: 'Create MDS NuGet Package'
@@ -153,6 +170,7 @@ jobs:
-p:PackageVersionSqlClient=${{ parameters.mdsPackageVersion }}
-p:PackageVersionAbstractions=${{ parameters.abstractionsPackageVersion }}
-p:PackageVersionLogging=${{ parameters.loggingPackageVersion }}
+ -p:PackageVersionSqlServer=${{ parameters.sqlServerPackageVersion }}
# PackSqlClient outputs to artifacts/Microsoft.Data.SqlClient/-/.
# Downstream steps (local feed copy, AKV pack, artifact publish) all expect packages at
@@ -184,6 +202,7 @@ jobs:
loggingPackageVersion: ${{ parameters.loggingPackageVersion }}
mdsPackageVersion: ${{ parameters.mdsPackageVersion }}
akvPackageVersion: ${{ parameters.akvPackageVersion }}
+ sqlServerPackageVersion: ${{ parameters.sqlServerPackageVersion }}
- task: DotNetCoreCLI@2
displayName: 'Create AKV Provider NuGet Package'
diff --git a/eng/pipelines/common/templates/jobs/ci-run-tests-job.yml b/eng/pipelines/common/templates/jobs/ci-run-tests-job.yml
index 5c593e11e3..8b79bf7274 100644
--- a/eng/pipelines/common/templates/jobs/ci-run-tests-job.yml
+++ b/eng/pipelines/common/templates/jobs/ci-run-tests-job.yml
@@ -88,6 +88,16 @@ parameters:
- name: mdsPackageVersion
type: string
+ # The name of the SqlServer pipeline artifact to download when referenceType is 'Package'.
+ - name: sqlServerArtifactsName
+ type: string
+ default: SqlServer.Artifacts
+
+ # The version of the SqlServer package to depend on when referenceType is 'Package'.
+ - name: sqlServerPackageVersion
+ type: string
+ default: $(sqlServerPackageVersion)
+
# TODO: What is this for?
- name: netcoreVersionTestUtils
type: string
@@ -194,6 +204,12 @@ jobs:
artifactName: ${{ parameters.mdsArtifactsName }}
targetPath: $(Build.SourcesDirectory)/packages
+ - task: DownloadPipelineArtifact@2
+ displayName: Download SqlServer Package Artifacts
+ inputs:
+ artifactName: ${{ parameters.sqlServerArtifactsName }}
+ targetPath: $(Build.SourcesDirectory)/packages
+
# Install the .NET SDK and Runtimes.
- template: /eng/pipelines/steps/install-dotnet.yml@self
parameters:
@@ -364,6 +380,7 @@ jobs:
abstractionsPackageVersion: ${{ parameters.abstractionsPackageVersion }}
loggingPackageVersion: ${{ parameters.loggingPackageVersion }}
mdsPackageVersion: ${{ parameters.mdsPackageVersion }}
+ sqlServerPackageVersion: ${{ parameters.sqlServerPackageVersion }}
- ${{ if and(eq(parameters.enableX86Test, true), eq(parameters.operatingSystem, 'Windows')) }}:
- template: /eng/pipelines/common/templates/steps/run-all-tests-step.yml@self
@@ -379,6 +396,7 @@ jobs:
abstractionsPackageVersion: ${{ parameters.abstractionsPackageVersion }}
loggingPackageVersion: ${{ parameters.loggingPackageVersion }}
mdsPackageVersion: ${{ parameters.mdsPackageVersion }}
+ sqlServerPackageVersion: ${{ parameters.sqlServerPackageVersion }}
- template: /eng/pipelines/common/templates/steps/publish-test-results-step.yml@self
parameters:
diff --git a/eng/pipelines/common/templates/stages/ci-run-tests-stage.yml b/eng/pipelines/common/templates/stages/ci-run-tests-stage.yml
index fd87d7d9ac..86ddc0ca45 100644
--- a/eng/pipelines/common/templates/stages/ci-run-tests-stage.yml
+++ b/eng/pipelines/common/templates/stages/ci-run-tests-stage.yml
@@ -50,6 +50,16 @@ parameters:
- name: mdsPackageVersion
type: string
+ # The name of the SqlServer pipeline artifacts to download.
+ - name: sqlServerArtifactsName
+ type: string
+ default: SqlServer.Artifacts
+
+ # The version of the SqlServer package to depend on when referenceType is 'Package'.
+ - name: sqlServerPackageVersion
+ type: string
+ default: $(sqlServerPackageVersion)
+
# Jobs to run after the test jobs complete, if any.
- name: postTestJobs
type: jobList
@@ -114,6 +124,8 @@ stages:
loggingPackageVersion: ${{ parameters.loggingPackageVersion }}
mdsArtifactsName: ${{ parameters.mdsArtifactsName }}
mdsPackageVersion: ${{ parameters.mdsPackageVersion }}
+ sqlServerArtifactsName: ${{ parameters.sqlServerArtifactsName }}
+ sqlServerPackageVersion: ${{ parameters.sqlServerPackageVersion }}
prebuildSteps: ${{ parameters.prebuildSteps }}
targetFramework: ${{ targetFramework }}
netcoreVersionTestUtils: ${{config.value.netcoreVersionTestUtils }}
@@ -150,6 +162,8 @@ stages:
loggingPackageVersion: ${{ parameters.loggingPackageVersion }}
mdsArtifactsName: ${{ parameters.mdsArtifactsName }}
mdsPackageVersion: ${{ parameters.mdsPackageVersion }}
+ sqlServerArtifactsName: ${{ parameters.sqlServerArtifactsName }}
+ sqlServerPackageVersion: ${{ parameters.sqlServerPackageVersion }}
prebuildSteps: ${{ parameters.prebuildSteps }}
targetFramework: ${{ targetFramework }}
netcoreVersionTestUtils: ${{config.value.netcoreVersionTestUtils }}
diff --git a/eng/pipelines/common/templates/steps/ci-project-build-step.yml b/eng/pipelines/common/templates/steps/ci-project-build-step.yml
index fe46ad66a2..e5fa6d4424 100644
--- a/eng/pipelines/common/templates/steps/ci-project-build-step.yml
+++ b/eng/pipelines/common/templates/steps/ci-project-build-step.yml
@@ -68,6 +68,11 @@ parameters:
type: string
default: $(akvPackageVersion)
+ # Necessary when referenceType is Package. Ignored when referenceType is Project.
+ - name: sqlServerPackageVersion
+ type: string
+ default: $(sqlServerPackageVersion)
+
steps:
# Build MDS
- ${{ if or(eq(parameters.build, 'MDS'), eq(parameters.build, 'all'), eq(parameters.build, 'allNoDocs')) }}:
@@ -85,6 +90,7 @@ steps:
-p:PackageVersionAbstractions=${{ parameters.abstractionsPackageVersion }}
-p:PackageVersionLogging=${{ parameters.loggingPackageVersion }}
-p:PackageVersionSqlClient=${{ parameters.mdsPackageVersion }}
+ -p:PackageVersionSqlServer=${{ parameters.sqlServerPackageVersion }}
# Build AKV Provider
- ${{ if or(eq(parameters.build, 'AkvProvider'), eq(parameters.build, 'all'), eq(parameters.build, 'allNoDocs')) }}:
@@ -103,3 +109,4 @@ steps:
-p:PackageVersionAbstractions=${{ parameters.abstractionsPackageVersion }}
-p:PackageVersionLogging=${{ parameters.loggingPackageVersion }}
-p:PackageVersionSqlClient=${{ parameters.mdsPackageVersion }}
+ -p:PackageVersionSqlServer=${{ parameters.sqlServerPackageVersion }}
diff --git a/eng/pipelines/common/templates/steps/run-all-tests-step.yml b/eng/pipelines/common/templates/steps/run-all-tests-step.yml
index cf3ce206a4..374c31c29a 100644
--- a/eng/pipelines/common/templates/steps/run-all-tests-step.yml
+++ b/eng/pipelines/common/templates/steps/run-all-tests-step.yml
@@ -22,6 +22,10 @@ parameters:
- name: mdsPackageVersion
type: string
+ - name: sqlServerPackageVersion
+ type: string
+ default: $(sqlServerPackageVersion)
+
- name: platform
type: string
default: $(Platform)
@@ -137,6 +141,7 @@ steps:
-p:PackageVersionAbstractions=${{ parameters.abstractionsPackageVersion }}
-p:PackageVersionLogging=${{ parameters.loggingPackageVersion }}
-p:PackageVersionSqlClient=${{ parameters.mdsPackageVersion }}
+ -p:PackageVersionSqlServer=${{ parameters.sqlServerPackageVersion }}
-p:TestResultsFolderPath=TestResults
${{ else }}: # x86
arguments: >-
@@ -147,6 +152,7 @@ steps:
-p:PackageVersionAbstractions=${{ parameters.abstractionsPackageVersion }}
-p:PackageVersionLogging=${{ parameters.loggingPackageVersion }}
-p:PackageVersionSqlClient=${{ parameters.mdsPackageVersion }}
+ -p:PackageVersionSqlServer=${{ parameters.sqlServerPackageVersion }}
-p:DotnetPath=${{ parameters.dotnetx86RootPath }}
-p:TestResultsFolderPath=TestResults
@@ -165,6 +171,7 @@ steps:
-p:PackageVersionAbstractions=${{ parameters.abstractionsPackageVersion }}
-p:PackageVersionLogging=${{ parameters.loggingPackageVersion }}
-p:PackageVersionSqlClient=${{ parameters.mdsPackageVersion }}
+ -p:PackageVersionSqlServer=${{ parameters.sqlServerPackageVersion }}
-p:TestFilters="category=flaky"
-p:TestResultsFolderPath=TestResults
-p:TestCodeCoverage=false
@@ -177,6 +184,7 @@ steps:
-p:PackageVersionAbstractions=${{ parameters.abstractionsPackageVersion }}
-p:PackageVersionLogging=${{ parameters.loggingPackageVersion }}
-p:PackageVersionSqlClient=${{ parameters.mdsPackageVersion }}
+ -p:PackageVersionSqlServer=${{ parameters.sqlServerPackageVersion }}
-p:DotnetPath=${{ parameters.dotnetx86RootPath }}
-p:TestFilters="category=flaky"
-p:TestResultsFolderPath=TestResults
@@ -199,6 +207,7 @@ steps:
-p:PackageVersionAbstractions=${{ parameters.abstractionsPackageVersion }}
-p:PackageVersionLogging=${{ parameters.loggingPackageVersion }}
-p:PackageVersionSqlClient=${{ parameters.mdsPackageVersion }}
+ -p:PackageVersionSqlServer=${{ parameters.sqlServerPackageVersion }}
-p:TestResultsFolderPath=TestResults
${{ else }}: # x86
arguments: >-
@@ -210,6 +219,7 @@ steps:
-p:PackageVersionAbstractions=${{ parameters.abstractionsPackageVersion }}
-p:PackageVersionLogging=${{ parameters.loggingPackageVersion }}
-p:PackageVersionSqlClient=${{ parameters.mdsPackageVersion }}
+ -p:PackageVersionSqlServer=${{ parameters.sqlServerPackageVersion }}
-p:DotnetPath=${{ parameters.dotnetx86RootPath }}
-p:TestResultsFolderPath=TestResults
retryCountOnTaskFailure: ${{parameters.retryCountOnManualTests }}
@@ -230,6 +240,7 @@ steps:
-p:PackageVersionAbstractions=${{ parameters.abstractionsPackageVersion }}
-p:PackageVersionLogging=${{ parameters.loggingPackageVersion }}
-p:PackageVersionSqlClient=${{ parameters.mdsPackageVersion }}
+ -p:PackageVersionSqlServer=${{ parameters.sqlServerPackageVersion }}
-p:TestFilters="category=flaky"
-p:TestResultsFolderPath=TestResults
-p:TestCodeCoverage=false
@@ -243,6 +254,7 @@ steps:
-p:PackageVersionAbstractions=${{ parameters.abstractionsPackageVersion }}
-p:PackageVersionLogging=${{ parameters.loggingPackageVersion }}
-p:PackageVersionSqlClient=${{ parameters.mdsPackageVersion }}
+ -p:PackageVersionSqlServer=${{ parameters.sqlServerPackageVersion }}
-p:DotnetPath=${{ parameters.dotnetx86RootPath }}
-p:TestFilters="category=flaky"
-p:TestResultsFolderPath=TestResults
@@ -292,6 +304,7 @@ steps:
-p:PackageVersionAbstractions=${{ parameters.abstractionsPackageVersion }}
-p:PackageVersionLogging=${{ parameters.loggingPackageVersion }}
-p:PackageVersionSqlClient=${{ parameters.mdsPackageVersion }}
+ -p:PackageVersionSqlServer=${{ parameters.sqlServerPackageVersion }}
-p:TestResultsFolderPath=TestResults
- task: DotNetCoreCLI@2
@@ -308,6 +321,7 @@ steps:
-p:PackageVersionAbstractions=${{ parameters.abstractionsPackageVersion }}
-p:PackageVersionLogging=${{ parameters.loggingPackageVersion }}
-p:PackageVersionSqlClient=${{ parameters.mdsPackageVersion }}
+ -p:PackageVersionSqlServer=${{ parameters.sqlServerPackageVersion }}
-p:TestFilters="category=flaky"
-p:TestResultsFolderPath=TestResults
-p:TestCodeCoverage=false
@@ -327,6 +341,7 @@ steps:
-p:PackageVersionAbstractions=${{ parameters.abstractionsPackageVersion }}
-p:PackageVersionLogging=${{ parameters.loggingPackageVersion }}
-p:PackageVersionSqlClient=${{ parameters.mdsPackageVersion }}
+ -p:PackageVersionSqlServer=${{ parameters.sqlServerPackageVersion }}
-p:TestResultsFolderPath=TestResults
retryCountOnTaskFailure: ${{parameters.retryCountOnManualTests }}
@@ -345,6 +360,7 @@ steps:
-p:PackageVersionAbstractions=${{ parameters.abstractionsPackageVersion }}
-p:PackageVersionLogging=${{ parameters.loggingPackageVersion }}
-p:PackageVersionSqlClient=${{ parameters.mdsPackageVersion }}
+ -p:PackageVersionSqlServer=${{ parameters.sqlServerPackageVersion }}
-p:TestFilters="category=flaky"
-p:TestResultsFolderPath=TestResults
-p:TestCodeCoverage=false
diff --git a/eng/pipelines/dotnet-sqlclient-ci-core.yml b/eng/pipelines/dotnet-sqlclient-ci-core.yml
index 912b041627..82bea2f31e 100644
--- a/eng/pipelines/dotnet-sqlclient-ci-core.yml
+++ b/eng/pipelines/dotnet-sqlclient-ci-core.yml
@@ -185,14 +185,17 @@ stages:
mdsPackageVersion: $(mdsPackageVersion)
akvPackageVersion: $(akvPackageVersion)
referenceType: ${{ parameters.referenceType }}
+ sqlServerArtifactsName: $(sqlServerArtifactsName)
+ sqlServerPackageVersion: $(sqlServerPackageVersion)
SNIVersion: ${{ parameters.SNIVersion }}
SNIValidationFeed: ${{ parameters.SNIValidationFeed }}
- # When building SqlClient via packages, we must depend on the Abstractions and Logging
- # packages.
+ # When building SqlClient via packages, we must depend on the Abstractions, Logging,
+ # and SqlServer packages.
${{ if eq(parameters.referenceType, 'Package') }}:
additionalDependsOn:
- build_abstractions_package_stage
- build_logging_package_stage
+ - build_sqlserver_package_stage
# Build the Azure package, and publish it to the pipeline artifacts under the
# given artifact name.
@@ -242,14 +245,17 @@ stages:
loggingPackageVersion: $(loggingPackageVersion)
mdsArtifactsName: $(mdsArtifactsName)
mdsPackageVersion: $(mdsPackageVersion)
+ sqlServerArtifactsName: $(sqlServerArtifactsName)
+ sqlServerPackageVersion: $(sqlServerPackageVersion)
testJobTimeout: ${{ parameters.testJobTimeout }}
# When testing MDS via packages, we must depend on the Abstractions,
- # Logging, MDS, and Azure packages.
+ # Logging, SqlServer, MDS, and Azure packages.
${{ if eq(parameters.referenceType, 'Package') }}:
additionalDependsOn:
- build_abstractions_package_stage
- build_logging_package_stage
+ - build_sqlserver_package_stage
- build_sqlclient_package_stage
- build_azure_package_stage
diff --git a/eng/pipelines/stages/build-sqlclient-package-ci-stage.yml b/eng/pipelines/stages/build-sqlclient-package-ci-stage.yml
index 57343a0006..858f1c8500 100644
--- a/eng/pipelines/stages/build-sqlclient-package-ci-stage.yml
+++ b/eng/pipelines/stages/build-sqlclient-package-ci-stage.yml
@@ -56,6 +56,16 @@ parameters:
- name: akvPackageVersion
type: string
+ # The name of the SqlServer pipeline artifacts to download.
+ - name: sqlServerArtifactsName
+ type: string
+ default: SqlServer.Artifacts
+
+ # The SqlServer package version.
+ - name: sqlServerPackageVersion
+ type: string
+ default: $(sqlServerPackageVersion)
+
# The C# project reference type to use when building and packing the packages.
- name: referenceType
type: string
@@ -97,6 +107,8 @@ stages:
mdsPackageVersion: ${{ parameters.mdsPackageVersion }}
mdsArtifactsName: ${{ parameters.mdsArtifactsName }}
akvPackageVersion: ${{ parameters.akvPackageVersion }}
+ sqlServerArtifactsName: ${{ parameters.sqlServerArtifactsName }}
+ sqlServerPackageVersion: ${{ parameters.sqlServerPackageVersion }}
${{ if ne(parameters.SNIVersion, '') }}:
prebuildSteps:
- template: /eng/pipelines/common/templates/steps/override-sni-version.yml@self
From d9d6217c2ff2460e54b11379b37219e7f5c6d7b6 Mon Sep 17 00:00:00 2001
From: Paul Medynski <31868385+paulmedynski@users.noreply.github.com>
Date: Wed, 13 May 2026 15:52:09 -0300
Subject: [PATCH 18/19] Improved docs for the SqlServer assembly checker in the
tests.
---
.../SqlServerStrongNameTestCondition.cs | 46 ++++++++++---------
1 file changed, 24 insertions(+), 22 deletions(-)
diff --git a/src/Microsoft.Data.SqlClient/tests/Common/SqlServerStrongNameTestCondition.cs b/src/Microsoft.Data.SqlClient/tests/Common/SqlServerStrongNameTestCondition.cs
index fed8b83d07..d50e1c05d1 100644
--- a/src/Microsoft.Data.SqlClient/tests/Common/SqlServerStrongNameTestCondition.cs
+++ b/src/Microsoft.Data.SqlClient/tests/Common/SqlServerStrongNameTestCondition.cs
@@ -5,33 +5,35 @@
namespace Microsoft.Data.SqlClient.TestCommon;
///
-/// Provides a shared xUnit conditional check for tests that depend on SQL Server UDT types.
+/// Provides a shared xUnit conditional check for tests that depend on the SqlServer assembly.
///
-///
-/// Why this exists: in PR and local project-reference builds, the Microsoft.SqlServer.Server
-/// assembly can be produced unsigned on .NET Framework when no signing key is available. Some UDT
-/// tests use Microsoft.SqlServer.Types (a publicly published NuGet package, not owned by
-/// us), which requires a strongly named Microsoft.SqlServer.Server assembly and fail with
-/// FileLoadException ( 0x80131044) when that requirement is not met.
-///
-/// This can also happen in package-based test runs when the consumed package was produced from an
-/// unsigned assembly (for example, package-mode restore from a local feed containing CI/dev
-/// artifacts), not only when using direct project references.
-///
-/// What this checks: on .NET Framework, it loads the UDT attribute type from
-/// Microsoft.SqlServer.Server and verifies that the assembly has a non-empty public key
-/// token (is strongly named). On .NET, this always returns because runtime
-/// strong-name validation is not enforced the same way.
-///
-/// When to use it: add this condition to tests that execute SQL Server UDT paths and are known to
-/// fail in unsigned net462 runs, regardless of whether the assembly comes from project references
-/// or locally produced packages.
-///
public static class SqlServerStrongNameTestCondition
{
///
- /// Gets whether SQL Server UDT tests are safe to run in the current runtime/signing context.
+ /// Returns true when an unsigned SqlServer assembly should be usable in conjunction with other
+ /// assemblies that explicitly depend on a strongly-named SqlServer assembly.
///
+ ///
+ /// Why this exists: in local builds and PR pipeline runs, the Microsoft.SqlServer.Server
+ /// assembly is likely to be produced unsigned. Some UDT tests reference
+ /// Microsoft.SqlServer.Types (a publicly published NuGet package, not owned by us),
+ /// which requires a strongly named Microsoft.SqlServer.Server assembly. The .NET
+ /// runtime doesn't enforce this relationship, and the tests run without incident regardless of
+ /// the signed-ness of the SqlServer assembly. However, .NET Framework _does_ enforce that the
+ /// SqlServer assembly us signed, and the tests fail to compile and/or run.
+ ///
+ /// This situation can occur in both Project and Package based test runs, the latter when the
+ /// consumed SqlServer package was produced from an unsigned assembly.
+ ///
+ /// What this checks: on .NET Framework, it loads the UDT attribute type from
+ /// Microsoft.SqlServer.Server and verifies that the assembly has a non-empty public key
+ /// token (is strongly named). On .NET, this always returns because
+ /// runtime strong-name validation is not enforced the same way.
+ ///
+ /// When to use it: add this condition to tests that execute SQL Server UDT paths and are known
+ /// to fail in unsigned .NET Framework runs, regardless of whether the assembly comes from
+ /// project references or locally produced packages.
+ ///
public static bool IsUnsignedSqlServerAssemblyUsable
{
get
From 2e1fc83b7454d0b8192463149eac73820fb861f4 Mon Sep 17 00:00:00 2001
From: Paul Medynski <31868385+paulmedynski@users.noreply.github.com>
Date: Thu, 14 May 2026 08:02:33 -0300
Subject: [PATCH 19/19] Plumb SqlServerPackageVersion to AKV pack and Azure
test pipelines
---
.../common/templates/jobs/ci-build-nugets-job.yml | 1 +
eng/pipelines/dotnet-sqlclient-ci-core.yml | 1 +
eng/pipelines/jobs/test-azure-package-ci-job.yml | 8 ++++++++
.../stages/build-azure-package-ci-stage.yml | 12 ++++++++++++
4 files changed, 22 insertions(+)
diff --git a/eng/pipelines/common/templates/jobs/ci-build-nugets-job.yml b/eng/pipelines/common/templates/jobs/ci-build-nugets-job.yml
index 1bcfc9beb3..e9c3ad7c64 100644
--- a/eng/pipelines/common/templates/jobs/ci-build-nugets-job.yml
+++ b/eng/pipelines/common/templates/jobs/ci-build-nugets-job.yml
@@ -218,6 +218,7 @@ jobs:
-p:PackageVersionAbstractions=${{ parameters.abstractionsPackageVersion }}
-p:PackageVersionLogging=${{ parameters.loggingPackageVersion }}
-p:PackageVersionSqlClient=${{ parameters.mdsPackageVersion }}
+ -p:PackageVersionSqlServer=${{ parameters.sqlServerPackageVersion }}
-p:PackageVersionAkvProvider=${{ parameters.akvPackageVersion }}
- task: CopyFiles@2
diff --git a/eng/pipelines/dotnet-sqlclient-ci-core.yml b/eng/pipelines/dotnet-sqlclient-ci-core.yml
index 82bea2f31e..0de11238ec 100644
--- a/eng/pipelines/dotnet-sqlclient-ci-core.yml
+++ b/eng/pipelines/dotnet-sqlclient-ci-core.yml
@@ -221,6 +221,7 @@ stages:
mdsPackageVersion: $(mdsPackageVersion)
referenceType: ${{ parameters.referenceType }}
sqlServerArtifactsName: $(sqlServerArtifactsName)
+ sqlServerPackageVersion: $(sqlServerPackageVersion)
# Verify that all NuGet packages comply with Microsoft metadata requirements.
# This runs on a Windows agent after all packages have been built and
diff --git a/eng/pipelines/jobs/test-azure-package-ci-job.yml b/eng/pipelines/jobs/test-azure-package-ci-job.yml
index 373a35fe94..770c69552a 100644
--- a/eng/pipelines/jobs/test-azure-package-ci-job.yml
+++ b/eng/pipelines/jobs/test-azure-package-ci-job.yml
@@ -87,6 +87,13 @@ parameters:
type: string
default: SqlServer.Artifacts
+ # The SqlServer package version to depend on.
+ #
+ # This is used when the referenceType is 'Package'.
+ - name: sqlServerPackageVersion
+ type: string
+ default: ''
+
# The list of .NET Framework runtimes to test against.
- name: netFrameworkRuntimes
type: object
@@ -162,6 +169,7 @@ jobs:
-p:ReferenceType=${{ parameters.referenceType }}
-p:AbstractionsPackageVersion=${{ parameters.abstractionsPackageVersion }}
-p:SqlClientPackageVersion=${{ parameters.mdsPackageVersion }}
+ -p:PackageVersionSqlServer=${{ parameters.sqlServerPackageVersion }}
# Explicitly unset the $PLATFORM environment variable that is set by the
# 'ADO Build properties' Library in the ADO SqlClientDrivers public
diff --git a/eng/pipelines/stages/build-azure-package-ci-stage.yml b/eng/pipelines/stages/build-azure-package-ci-stage.yml
index b71cd75cda..9fc42bf963 100644
--- a/eng/pipelines/stages/build-azure-package-ci-stage.yml
+++ b/eng/pipelines/stages/build-azure-package-ci-stage.yml
@@ -122,6 +122,13 @@ parameters:
type: string
default: SqlServer.Artifacts
+ # The SqlServer package version to depend on.
+ #
+ # This is used when the referenceType is 'Package'.
+ - name: sqlServerPackageVersion
+ type: string
+ default: ''
+
# The C# project reference type to use when building and packing the packages.
- name: referenceType
type: string
@@ -163,6 +170,7 @@ stages:
mdsArtifactsName: ${{ parameters.mdsArtifactsName }}
mdsPackageVersion: ${{ parameters.mdsPackageVersion }}
sqlServerArtifactsName: ${{ parameters.sqlServerArtifactsName }}
+ sqlServerPackageVersion: ${{ parameters.sqlServerPackageVersion }}
netFrameworkRuntimes: []
netRuntimes: [net8.0, net9.0, net10.0]
poolName: ${{ parameters.azurePoolName }}
@@ -182,6 +190,7 @@ stages:
mdsArtifactsName: ${{ parameters.mdsArtifactsName }}
mdsPackageVersion: ${{ parameters.mdsPackageVersion }}
sqlServerArtifactsName: ${{ parameters.sqlServerArtifactsName }}
+ sqlServerPackageVersion: ${{ parameters.sqlServerPackageVersion }}
netFrameworkRuntimes: []
netRuntimes: [net8.0, net9.0, net10.0]
poolName: ${{ parameters.adoPoolName }}
@@ -210,6 +219,7 @@ stages:
mdsArtifactsName: ${{ parameters.mdsArtifactsName }}
mdsPackageVersion: ${{ parameters.mdsPackageVersion }}
sqlServerArtifactsName: ${{ parameters.sqlServerArtifactsName }}
+ sqlServerPackageVersion: ${{ parameters.sqlServerPackageVersion }}
netFrameworkRuntimes: [net462]
netRuntimes: [net8.0, net9.0, net10.0]
poolName: ${{ parameters.azurePoolName }}
@@ -229,6 +239,7 @@ stages:
mdsArtifactsName: ${{ parameters.mdsArtifactsName }}
mdsPackageVersion: ${{ parameters.mdsPackageVersion }}
sqlServerArtifactsName: ${{ parameters.sqlServerArtifactsName }}
+ sqlServerPackageVersion: ${{ parameters.sqlServerPackageVersion }}
netFrameworkRuntimes: [net462]
netRuntimes: [net8.0, net9.0, net10.0]
poolName: ${{ parameters.adoPoolName }}
@@ -266,6 +277,7 @@ stages:
mdsArtifactsName: ${{ parameters.mdsArtifactsName }}
mdsPackageVersion: ${{ parameters.mdsPackageVersion }}
sqlServerArtifactsName: ${{ parameters.sqlServerArtifactsName }}
+ sqlServerPackageVersion: ${{ parameters.sqlServerPackageVersion }}
netFrameworkRuntimes: []
netRuntimes: [net8.0, net9.0, net10.0]
poolName: ${{ parameters.azurePoolName }}