From 3a8467d0bbf3fa98664169ea9945d69a0631ef78 Mon Sep 17 00:00:00 2001
From: Paul Medynski <31868385+paulmedynski@users.noreply.github.com>
Date: Thu, 14 May 2026 10:07:46 -0300
Subject: [PATCH 01/22] Add SqlServer.Server as a sibling project reference
Wire Microsoft.SqlServer.Server as a project reference (ReferenceType=Project)
or package reference (ReferenceType=Package) across all consuming projects:
SqlClient src/ref/notsupported, Abstractions, Azure, AKV Provider, UDT test
projects, samples, and doc projects.
- Add Versions.props to each sibling project for package version management
- Add PackageVersionSqlServer build argument to build.proj
- Update Directory.Packages.props with SqlServer version properties
- Add local feed mirroring for Package mode builds
- Update versioning comment documentation in Directory.Build.props
---
Directory.Packages.props | 37 ++---
build.proj | 130 ++++++++++++++++--
doc/Directory.Packages.props | 1 +
.../Microsoft.Data.SqlClient.Samples.csproj | 13 +-
src/Directory.Build.props | 6 +-
...waysEncrypted.AzureKeyVaultProvider.csproj | 2 +-
.../src/Versions.props | 4 +
.../Abstractions/src/Abstractions.csproj | 6 +-
.../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 | 17 ++-
.../ref/Microsoft.Data.SqlClient.csproj | 11 +-
.../src/Microsoft.Data.SqlClient.csproj | 7 +-
...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 | 13 +-
.../Microsoft.SqlServer.Server.csproj | 2 +-
src/Microsoft.SqlServer.Server/Versions.props | 4 +
25 files changed, 242 insertions(+), 64 deletions(-)
diff --git a/Directory.Packages.props b/Directory.Packages.props
index 62918f7d65..f47d7ea9ac 100644
--- a/Directory.Packages.props
+++ b/Directory.Packages.props
@@ -1,4 +1,17 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
true
-
-
-
-
-
-
-
-
+
+
-
+
diff --git a/build.proj b/build.proj
index 971cfb12fa..86f39d6ebd 100644
--- a/build.proj
+++ b/build.proj
@@ -1,5 +1,6 @@
+
@@ -208,12 +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, the central feed version will be used
- instead (see 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
@@ -370,6 +374,7 @@
$(SqlClientSrcRoot)src/Microsoft.Data.SqlClient.csproj
$(SqlClientSrcRoot)ref/Microsoft.Data.SqlClient.csproj
$(SqlClientSrcRoot)notsupported/Microsoft.Data.SqlClient.csproj
+ $(SqlClientArtifactRoot)$(ReferenceType)-$(Configuration)/
$(SqlClientSrcRoot)tests/FunctionalTests/Microsoft.Data.SqlClient.FunctionalTests.csproj
@@ -390,7 +395,10 @@
PlatformNotSupportedException. It generates the source for this using GenAPI which is built as
the first step of this target.
-->
-
+
+ PackAbstractions;PackSqlServer
+
+
"$(DotnetPath)dotnet" build "$(GenApiProjectPath)"
@@ -424,6 +432,7 @@
$(ReferenceTypeArgument)
$(PackageVersionAbstractionsArgument)
$(PackageVersionLoggingArgument)
+ $(PackageVersionSqlServerArgument)
$([System.Text.RegularExpressions.Regex]::Replace($(DotnetCommand), "\s+", " "))
@@ -434,7 +443,10 @@
-
+
+ PackAbstractions;PackSqlServer
+
+
"$(DotnetPath)dotnet" build $(SqlClientRefProjectPath)
@@ -449,6 +461,7 @@
$(ReferenceTypeArgument)
$(PackageVersionAbstractionsArgument)
+ $(PackageVersionSqlServerArgument)
$([System.Text.RegularExpressions.Regex]::Replace($(DotnetCommand), "\s+", " "))
@@ -459,7 +472,10 @@
-
+
+ PackAbstractions;PackLogging;PackSqlServer
+
+
"$(DotnetPath)dotnet" build $(SqlClientProjectPath)
@@ -476,6 +492,7 @@
$(ReferenceTypeArgument)
$(PackageVersionAbstractionsArgument)
$(PackageVersionLoggingArgument)
+ $(PackageVersionSqlServerArgument)
$([System.Text.RegularExpressions.Regex]::Replace($(DotnetCommand), "\s+", " "))
@@ -486,7 +503,10 @@
-
+
+ PackAbstractions;PackLogging;PackSqlServer
+
+
"$(DotnetPath)dotnet" build $(SqlClientProjectPath)
@@ -503,6 +523,7 @@
$(ReferenceTypeArgument)
$(PackageVersionAbstractionsArgument)
$(PackageVersionLoggingArgument)
+ $(PackageVersionSqlServerArgument)
$([System.Text.RegularExpressions.Regex]::Replace($(DotnetCommand), "\s+", " "))
@@ -547,13 +568,24 @@
$(PackageVersionLoggingArgument)
- -p:PackageOutputPath="$(SqlClientArtifactRoot)/$(ReferenceType)-$(Configuration)"
+ -p:PackageOutputPath="$(SqlClientPackageArtifactRoot)"
$([System.Text.RegularExpressions.Regex]::Replace($(DotnetCommand), "\s+", " "))
+
+
+
+
+
+
+
@@ -654,10 +686,14 @@
$(RepoRoot)src/Microsoft.Data.SqlClient.AlwaysEncrypted.AzureKeyVaultProvider/
$(AkvProviderSrcRoot)src/Microsoft.Data.SqlClient.AlwaysEncrypted.AzureKeyVaultProvider.csproj
+ $(RepoRoot)artifacts/Microsoft.Data.SqlClient.AlwaysEncrypted.AzureKeyVaultProvider/$(Configuration)/
-
+
+ PackSqlClient;PackLogging
+
+
"$(DotnetPath)dotnet" build "$(AkvProviderProjectPath)"
@@ -709,18 +745,34 @@
+
+
+
+
+
+
+
+
$(RepoRoot)src/Microsoft.Data.SqlClient.Extensions/Abstractions/
$(AbstractionsSrcRoot)src/Abstractions.csproj
$(AbstractionsSrcRoot)test/Abstractions.Test.csproj
+ $(RepoRoot)artifacts/Microsoft.Data.SqlClient.Extensions.Abstractions/$(Configuration)/
-
+
+ PackLogging
+
+
"$(DotnetPath)dotnet" build "$(AbstractionsProjectPath)"
@@ -768,6 +820,17 @@
+
+
+
+
+
+
+
@@ -804,10 +867,14 @@
$(RepoRoot)src/Microsoft.Data.SqlClient.Extensions/Azure/
$(AzureSrcRoot)src/Azure.csproj
$(AzureSrcRoot)test/Azure.Test.csproj
+ $(RepoRoot)artifacts/Microsoft.Data.SqlClient.Extensions.Azure/$(Configuration)/
-
+
+ PackAbstractions;PackLogging
+
+
"$(DotnetPath)dotnet" build "$(AzureProjectPath)"
@@ -855,6 +922,17 @@
+
+
+
+
+
+
+
@@ -891,6 +969,7 @@
$(RepoRoot)src/Microsoft.Data.SqlClient.Internal/Logging/src/
$(LoggingSrcRoot)Logging.csproj
+ $(RepoRoot)artifacts/Microsoft.Data.SqlClient.Internal.Logging/$(Configuration)/
@@ -934,6 +1013,17 @@
+
+
+
+
+
+
+
@@ -970,6 +1060,7 @@
"$(DotnetPath)dotnet" pack $(SqlServerProjectPath)
-p:Configuration=$(Configuration)
+ -p:PackageOutputPath="$(PackagesDir)"
$(PackBuildArgument)
$(SigningKeyPathArgument)
@@ -984,5 +1075,16 @@
+
+
+
+
+
+
+
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 @@
+
diff --git a/doc/samples/Microsoft.Data.SqlClient.Samples.csproj b/doc/samples/Microsoft.Data.SqlClient.Samples.csproj
index c194fac4d0..44a153f6f2 100644
--- a/doc/samples/Microsoft.Data.SqlClient.Samples.csproj
+++ b/doc/samples/Microsoft.Data.SqlClient.Samples.csproj
@@ -10,14 +10,19 @@
False
+
-
-
-
-
+
+
+
+
+
+
+
+
diff --git a/src/Directory.Build.props b/src/Directory.Build.props
index e760ebe9f3..f8ac03e168 100644
--- a/src/Directory.Build.props
+++ b/src/Directory.Build.props
@@ -35,7 +35,11 @@
-
+
$(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)
@@ -71,9 +71,9 @@
+ Condition="'$(ReferenceType)' != 'Package'" />
+ Condition="'$(ReferenceType)' == 'Package'" />
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 @@
+
+
+
+
+
@@ -156,7 +163,6 @@
-
@@ -170,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 0b6282965d..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 @@
+
+
+
+
+
@@ -112,7 +119,6 @@
-
@@ -124,7 +130,6 @@
-
diff --git a/src/Microsoft.Data.SqlClient/src/Microsoft.Data.SqlClient.csproj b/src/Microsoft.Data.SqlClient/src/Microsoft.Data.SqlClient.csproj
index cd7fdb4b79..c64546ab96 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)
@@ -173,10 +173,13 @@
$(SourceRevisionId)
$(NuspecProperties);COMMITID=$(CommitId)
+
+
+
+
<_AbstractionsPackageVersionTrimmed>$([System.String]::Copy('$(AbstractionsPackageVersion)').Trim())
<_LoggingPackageVersionTrimmed>$([System.String]::Copy('$(LoggingPackageVersion)').Trim())
-
+
+
+
+
+
@@ -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..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
@@ -39,16 +39,26 @@
+
+
+
+
+
+
-
@@ -65,7 +75,6 @@
-
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
+
+
@@ -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 the SqlServer assembly.
+///
+public static class SqlServerStrongNameTestCondition
+{
+ ///
+ /// 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
+ {
+ #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 e22b8b75cf4cb34096ccc386a1aac8cd310b5dcb 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 03/22] 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 | 1 +
.../src/Microsoft.Data.SqlClient.csproj | 12 +++++++++---
.../src/Microsoft.Data.SqlClient.nuspec | 6 +++---
3 files changed, 13 insertions(+), 6 deletions(-)
diff --git a/build.proj b/build.proj
index 03994cf371..a312659176 100644
--- a/build.proj
+++ b/build.proj
@@ -566,6 +566,7 @@
$(ReferenceTypeArgument)
$(PackageVersionAbstractionsArgument)
$(PackageVersionLoggingArgument)
+ $(PackageVersionSqlServerArgument)
-p:PackageOutputPath="$(SqlClientPackageArtifactRoot)"
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 01b035841ce4ed0981811a963bef76def2490db0 Mon Sep 17 00:00:00 2001
From: Paul Medynski <31868385+paulmedynski@users.noreply.github.com>
Date: Thu, 14 May 2026 10:10:03 -0300
Subject: [PATCH 04/22] Plumb SqlServerPackageVersion through CI pipelines
Pass the locally-built SqlServer.Server package version through all build
and test pipeline templates:
- ci-build-nugets-job: accept and forward SqlServerPackageVersion
- ci-run-tests-job/stage: download SqlServer artifacts, forward version
- ci-project-build-step: pass version to dotnet build
- run-all-tests-step: pass version to all MSBuild test invocations
- dotnet-sqlclient-ci-core: wire version to all stages
- build-sqlclient-package-ci-stage: forward to build job
- build-azure-package-ci-stage: forward to build and test jobs
- test-azure-package-ci-job: download SqlServer artifacts
---
build.proj | 10 +++++--
.../templates/jobs/ci-build-nugets-job.yml | 20 ++++++++++++++
.../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 | 17 +++++++++---
.../jobs/test-azure-package-ci-job.yml | 26 +++++++++++++++++++
.../stages/build-azure-package-ci-stage.yml | 25 ++++++++++++++++++
.../build-sqlclient-package-ci-stage.yml | 12 +++++++++
10 files changed, 159 insertions(+), 6 deletions(-)
diff --git a/build.proj b/build.proj
index a312659176..d71fad2518 100644
--- a/build.proj
+++ b/build.proj
@@ -615,6 +615,7 @@
$(PackageVersionAbstractionsArgument)
$(PackageVersionLoggingArgument)
$(PackageVersionSqlClientArgument)
+ $(PackageVersionSqlServerArgument)
$([System.Text.RegularExpressions.Regex]::Replace($(DotnetCommand), "\s+", " "))
@@ -646,6 +647,7 @@
$(PackageVersionAbstractionsArgument)
$(PackageVersionLoggingArgument)
$(PackageVersionSqlClientArgument)
+ $(PackageVersionSqlServerArgument)
$([System.Text.RegularExpressions.Regex]::Replace($(DotnetCommand), "\s+", " "))
@@ -711,6 +713,7 @@
$(PackageVersionAbstractionsArgument)
$(PackageVersionLoggingArgument)
$(PackageVersionSqlClientArgument)
+ $(PackageVersionSqlServerArgument)
$([System.Text.RegularExpressions.Regex]::Replace($(DotnetCommand), "\s+", " "))
@@ -739,6 +742,7 @@
$(PackageVersionAbstractionsArgument)
$(PackageVersionLoggingArgument)
$(PackageVersionSqlClientArgument)
+ $(PackageVersionSqlServerArgument)
$([System.Text.RegularExpressions.Regex]::Replace($(DotnetCommand), "\s+", " "))
@@ -954,14 +958,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..e9c3ad7c64 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'
@@ -199,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/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 c8181aff5a..0de11238ec 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.
@@ -206,16 +209,19 @@ 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)
+ 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
@@ -240,14 +246,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/jobs/test-azure-package-ci-job.yml b/eng/pipelines/jobs/test-azure-package-ci-job.yml
index cd9b87e103..770c69552a 100644
--- a/eng/pipelines/jobs/test-azure-package-ci-job.yml
+++ b/eng/pipelines/jobs/test-azure-package-ci-job.yml
@@ -79,6 +79,21 @@ 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 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
@@ -154,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
@@ -208,6 +224,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..9fc42bf963 100644
--- a/eng/pipelines/stages/build-azure-package-ci-stage.yml
+++ b/eng/pipelines/stages/build-azure-package-ci-stage.yml
@@ -114,6 +114,21 @@ 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 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
@@ -154,6 +169,8 @@ stages:
jobNameSuffix: linux
mdsArtifactsName: ${{ parameters.mdsArtifactsName }}
mdsPackageVersion: ${{ parameters.mdsPackageVersion }}
+ sqlServerArtifactsName: ${{ parameters.sqlServerArtifactsName }}
+ sqlServerPackageVersion: ${{ parameters.sqlServerPackageVersion }}
netFrameworkRuntimes: []
netRuntimes: [net8.0, net9.0, net10.0]
poolName: ${{ parameters.azurePoolName }}
@@ -172,6 +189,8 @@ stages:
jobNameSuffix: linux_integration
mdsArtifactsName: ${{ parameters.mdsArtifactsName }}
mdsPackageVersion: ${{ parameters.mdsPackageVersion }}
+ sqlServerArtifactsName: ${{ parameters.sqlServerArtifactsName }}
+ sqlServerPackageVersion: ${{ parameters.sqlServerPackageVersion }}
netFrameworkRuntimes: []
netRuntimes: [net8.0, net9.0, net10.0]
poolName: ${{ parameters.adoPoolName }}
@@ -199,6 +218,8 @@ stages:
jobNameSuffix: windows
mdsArtifactsName: ${{ parameters.mdsArtifactsName }}
mdsPackageVersion: ${{ parameters.mdsPackageVersion }}
+ sqlServerArtifactsName: ${{ parameters.sqlServerArtifactsName }}
+ sqlServerPackageVersion: ${{ parameters.sqlServerPackageVersion }}
netFrameworkRuntimes: [net462]
netRuntimes: [net8.0, net9.0, net10.0]
poolName: ${{ parameters.azurePoolName }}
@@ -217,6 +238,8 @@ stages:
jobNameSuffix: windows_integration
mdsArtifactsName: ${{ parameters.mdsArtifactsName }}
mdsPackageVersion: ${{ parameters.mdsPackageVersion }}
+ sqlServerArtifactsName: ${{ parameters.sqlServerArtifactsName }}
+ sqlServerPackageVersion: ${{ parameters.sqlServerPackageVersion }}
netFrameworkRuntimes: [net462]
netRuntimes: [net8.0, net9.0, net10.0]
poolName: ${{ parameters.adoPoolName }}
@@ -253,6 +276,8 @@ stages:
jobNameSuffix: macos
mdsArtifactsName: ${{ parameters.mdsArtifactsName }}
mdsPackageVersion: ${{ parameters.mdsPackageVersion }}
+ sqlServerArtifactsName: ${{ parameters.sqlServerArtifactsName }}
+ sqlServerPackageVersion: ${{ parameters.sqlServerPackageVersion }}
netFrameworkRuntimes: []
netRuntimes: [net8.0, net9.0, net10.0]
poolName: ${{ parameters.azurePoolName }}
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 972665d51e39b060fa5a33dbbc6cae7a0eccdde1 Mon Sep 17 00:00:00 2001
From: Paul Medynski <31868385+paulmedynski@users.noreply.github.com>
Date: Thu, 14 May 2026 11:42:00 -0300
Subject: [PATCH 05/22] Fix net462 build: enable implicit usings in TestCommon,
fix typo
- Add ImplicitUsings=enable to TestCommon.csproj so System.Type resolves
on net462 (fixes CS0246 in SqlServerStrongNameTestCondition.cs)
- Fix typo: 'assembly us signed' -> 'assembly is signed'
---
.../tests/Common/Microsoft.Data.SqlClient.TestCommon.csproj | 1 +
.../tests/Common/SqlServerStrongNameTestCondition.cs | 2 +-
2 files changed, 2 insertions(+), 1 deletion(-)
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..71e4f305e1 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
@@ -3,6 +3,7 @@
Microsoft.Data.SqlClient.TestCommon
Microsoft.Data.SqlClient.TestCommon
enable
+ enable
-
-
+
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 77a70b349b..203aabd1f5 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,6 +12,9 @@
+
$(AkvProviderAssemblyVersion)
diff --git a/src/Microsoft.Data.SqlClient.AlwaysEncrypted.AzureKeyVaultProvider/src/Versions.props b/src/Microsoft.Data.SqlClient.AlwaysEncrypted.AzureKeyVaultProvider/src/Versions.props
index 3e674c3fc4..92cee863da 100644
--- a/src/Microsoft.Data.SqlClient.AlwaysEncrypted.AzureKeyVaultProvider/src/Versions.props
+++ b/src/Microsoft.Data.SqlClient.AlwaysEncrypted.AzureKeyVaultProvider/src/Versions.props
@@ -13,6 +13,12 @@
NuGet package. It should be in the form: (Major).(Minor).(Patch)[-(Suffix)(BuildNumber)]
-->
+
true
diff --git a/src/Microsoft.Data.SqlClient.Extensions/Abstractions/src/Abstractions.csproj b/src/Microsoft.Data.SqlClient.Extensions/Abstractions/src/Abstractions.csproj
index 74424c15c8..0a9d29aa1e 100644
--- a/src/Microsoft.Data.SqlClient.Extensions/Abstractions/src/Abstractions.csproj
+++ b/src/Microsoft.Data.SqlClient.Extensions/Abstractions/src/Abstractions.csproj
@@ -22,6 +22,9 @@
+
$(AbstractionsAssemblyVersion)
diff --git a/src/Microsoft.Data.SqlClient.Extensions/Abstractions/src/Versions.props b/src/Microsoft.Data.SqlClient.Extensions/Abstractions/src/Versions.props
index 9063996d7e..5fddfb2df4 100644
--- a/src/Microsoft.Data.SqlClient.Extensions/Abstractions/src/Versions.props
+++ b/src/Microsoft.Data.SqlClient.Extensions/Abstractions/src/Versions.props
@@ -13,6 +13,12 @@
naming. It must be in the form: (Major).0.0.0
-->
+
true
diff --git a/src/Microsoft.Data.SqlClient.Extensions/Azure/src/Azure.csproj b/src/Microsoft.Data.SqlClient.Extensions/Azure/src/Azure.csproj
index 1ad4784f57..dddf5673f9 100644
--- a/src/Microsoft.Data.SqlClient.Extensions/Azure/src/Azure.csproj
+++ b/src/Microsoft.Data.SqlClient.Extensions/Azure/src/Azure.csproj
@@ -22,6 +22,9 @@
+
$(AzureAssemblyVersion)
diff --git a/src/Microsoft.Data.SqlClient.Extensions/Azure/src/Versions.props b/src/Microsoft.Data.SqlClient.Extensions/Azure/src/Versions.props
index 948cc6c7fc..46688789bc 100644
--- a/src/Microsoft.Data.SqlClient.Extensions/Azure/src/Versions.props
+++ b/src/Microsoft.Data.SqlClient.Extensions/Azure/src/Versions.props
@@ -13,6 +13,12 @@
form: (Major).(Minor).(Patch).(BuildNumber)
-->
+
true
diff --git a/src/Microsoft.Data.SqlClient.Internal/Logging/src/Logging.csproj b/src/Microsoft.Data.SqlClient.Internal/Logging/src/Logging.csproj
index ad9a75441d..d1c3e0fc5c 100644
--- a/src/Microsoft.Data.SqlClient.Internal/Logging/src/Logging.csproj
+++ b/src/Microsoft.Data.SqlClient.Internal/Logging/src/Logging.csproj
@@ -24,6 +24,9 @@
+
$(LoggingAssemblyVersion)
diff --git a/src/Microsoft.Data.SqlClient.Internal/Logging/src/Versions.props b/src/Microsoft.Data.SqlClient.Internal/Logging/src/Versions.props
index 15e1d85de2..fc1dafb33e 100644
--- a/src/Microsoft.Data.SqlClient.Internal/Logging/src/Versions.props
+++ b/src/Microsoft.Data.SqlClient.Internal/Logging/src/Versions.props
@@ -13,6 +13,12 @@
naming. It must be in the form: (Major).0.0.0
-->
+
true
diff --git a/src/Microsoft.Data.SqlClient/Versions.props b/src/Microsoft.Data.SqlClient/Versions.props
index a380e45e47..712263b73e 100644
--- a/src/Microsoft.Data.SqlClient/Versions.props
+++ b/src/Microsoft.Data.SqlClient/Versions.props
@@ -13,6 +13,12 @@
package. It should be in the form: (Major).(Minor).(Patch)[-(Suffix)(BuildNumber)]
-->
+
true
diff --git a/src/Microsoft.Data.SqlClient/notsupported/Microsoft.Data.SqlClient.csproj b/src/Microsoft.Data.SqlClient/notsupported/Microsoft.Data.SqlClient.csproj
index 22f43a4b51..a9474613e6 100644
--- a/src/Microsoft.Data.SqlClient/notsupported/Microsoft.Data.SqlClient.csproj
+++ b/src/Microsoft.Data.SqlClient/notsupported/Microsoft.Data.SqlClient.csproj
@@ -73,6 +73,9 @@
+
$(SqlClientAssemblyVersion)
diff --git a/src/Microsoft.Data.SqlClient/ref/Microsoft.Data.SqlClient.csproj b/src/Microsoft.Data.SqlClient/ref/Microsoft.Data.SqlClient.csproj
index 989f94decb..fe871099e6 100644
--- a/src/Microsoft.Data.SqlClient/ref/Microsoft.Data.SqlClient.csproj
+++ b/src/Microsoft.Data.SqlClient/ref/Microsoft.Data.SqlClient.csproj
@@ -11,6 +11,9 @@
+
$(SqlClientAssemblyVersion)
diff --git a/src/Microsoft.Data.SqlClient/src/Microsoft.Data.SqlClient.csproj b/src/Microsoft.Data.SqlClient/src/Microsoft.Data.SqlClient.csproj
index b2d61111d5..d7a7ef060a 100644
--- a/src/Microsoft.Data.SqlClient/src/Microsoft.Data.SqlClient.csproj
+++ b/src/Microsoft.Data.SqlClient/src/Microsoft.Data.SqlClient.csproj
@@ -50,6 +50,9 @@
+
$(SqlClientAssemblyVersion)
diff --git a/src/Microsoft.SqlServer.Server/Microsoft.SqlServer.Server.csproj b/src/Microsoft.SqlServer.Server/Microsoft.SqlServer.Server.csproj
index 060024c239..a995fa13b9 100644
--- a/src/Microsoft.SqlServer.Server/Microsoft.SqlServer.Server.csproj
+++ b/src/Microsoft.SqlServer.Server/Microsoft.SqlServer.Server.csproj
@@ -6,6 +6,9 @@
+
$(SqlServerAssemblyVersion)
diff --git a/src/Microsoft.SqlServer.Server/Versions.props b/src/Microsoft.SqlServer.Server/Versions.props
index 7be7913091..2a35868c7d 100644
--- a/src/Microsoft.SqlServer.Server/Versions.props
+++ b/src/Microsoft.SqlServer.Server/Versions.props
@@ -13,6 +13,12 @@
naming. It must be in the form: (Major).0.0.0
-->
+
true
From bb91c5f7f37c5a4f5554a3c6715fd4e95dceb9e3 Mon Sep 17 00:00:00 2001
From: Paul Medynski <31868385+paulmedynski@users.noreply.github.com>
Date: Thu, 14 May 2026 13:41:17 -0300
Subject: [PATCH 07/22] Exclude UDT tests requiring signed assemblies on
unsigned .NET Framework builds
- Add [Trait("Category", "signed")] under #if NETFRAMEWORK to tests that
load Microsoft.SqlServer.Types (depends on strongly-named SqlServer.Server)
- Append category!=signed to TestFilters in build.proj when SigningKeyPath is
empty (unsigned build)
- Remove SqlServerStrongNameTestCondition runtime probe (no longer needed)
- Revert ConditionalFact wrappers to original form in SqlServerTypesTest
---
build.proj | 6 ++
.../SqlServerStrongNameTestCondition.cs | 61 -------------------
.../FunctionalTests/SqlDataRecordTest.cs | 6 +-
.../SQL/UdtTest/SqlServerTypesTest.cs | 38 +++++-------
4 files changed, 26 insertions(+), 85 deletions(-)
delete mode 100644 src/Microsoft.Data.SqlClient/tests/Common/SqlServerStrongNameTestCondition.cs
diff --git a/build.proj b/build.proj
index d71fad2518..23e3793645 100644
--- a/build.proj
+++ b/build.proj
@@ -288,6 +288,12 @@
Allowed values: (category_expression|none)
-->
category!=failing&category!=flaky&category!=interactive
+
+ $(TestFilters)&category!=signed
--filter "$(TestFilters)"
diff --git a/src/Microsoft.Data.SqlClient/tests/Common/SqlServerStrongNameTestCondition.cs b/src/Microsoft.Data.SqlClient/tests/Common/SqlServerStrongNameTestCondition.cs
deleted file mode 100644
index e0bf3afb75..0000000000
--- a/src/Microsoft.Data.SqlClient/tests/Common/SqlServerStrongNameTestCondition.cs
+++ /dev/null
@@ -1,61 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-// See the LICENSE file in the project root for more information.
-
-namespace Microsoft.Data.SqlClient.TestCommon;
-
-///
-/// Provides a shared xUnit conditional check for tests that depend on the SqlServer assembly.
-///
-public static class SqlServerStrongNameTestCondition
-{
- ///
- /// 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 is 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
- {
- #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 c11737babe..b051f2cc26 100644
--- a/src/Microsoft.Data.SqlClient/tests/FunctionalTests/SqlDataRecordTest.cs
+++ b/src/Microsoft.Data.SqlClient/tests/FunctionalTests/SqlDataRecordTest.cs
@@ -8,7 +8,6 @@
using System.Data;
using System.Data.SqlTypes;
using Microsoft.Data.SqlClient.Server;
-using Microsoft.Data.SqlClient.TestCommon;
using Microsoft.SqlServer.Types;
using Xunit;
@@ -333,7 +332,10 @@ public void GetChar_ThrowsNotSupported()
Assert.Throws(() => record.GetChar(0));
}
- [ConditionalTheory(typeof(SqlServerStrongNameTestCondition), nameof(SqlServerStrongNameTestCondition.IsUnsignedSqlServerAssemblyUsable))]
+ [Theory]
+ #if NETFRAMEWORK
+ [Trait("Category", "signed")] // Requires strong-name signed Microsoft.SqlServer.Server
+ #endif
[MemberData(
nameof(GetUdtTypeTestData.Get),
MemberType = typeof(GetUdtTypeTestData),
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 5b83a86eff..b590a7c451 100644
--- a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/UdtTest/SqlServerTypesTest.cs
+++ b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/UdtTest/SqlServerTypesTest.cs
@@ -11,7 +11,6 @@
using System.IO;
using System.Linq;
using System.Text;
-using Microsoft.Data.SqlClient.TestCommon;
using Microsoft.SqlServer.Types;
using Xunit;
@@ -19,23 +18,6 @@ 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, " +
@@ -52,7 +34,10 @@ public static class SqlServerTypesTest
private const string HierarchyIdBytesHexString = "5ade";
// Synapse: Parse error at line: 1, column: 48: Incorrect syntax near 'hierarchyid'.
- [ConditionalFact(nameof(IsSqlServerTypesUdtTestsEnabled))]
+ [ConditionalFact(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup), nameof(DataTestUtility.IsNotAzureSynapse))]
+ #if NETFRAMEWORK
+ [Trait("Category", "signed")] // Requires strong-name signed Microsoft.SqlServer.Server
+ #endif
public static void GetSchemaTableTest()
{
string db = new SqlConnectionStringBuilder(DataTestUtility.TCPConnectionString).InitialCatalog;
@@ -78,7 +63,10 @@ public static void GetSchemaTableTest()
}
// Synapse: Parse error at line: 1, column: 48: Incorrect syntax near 'hierarchyid'.
- [ConditionalFact(nameof(IsSqlServerTypesUdtTestsEnabled))]
+ [ConditionalFact(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup), nameof(DataTestUtility.IsNotAzureSynapse))]
+ #if NETFRAMEWORK
+ [Trait("Category", "signed")] // Requires strong-name signed Microsoft.SqlServer.Server
+ #endif
public static void GetValueTest()
{
using (SqlConnection conn = new SqlConnection(DataTestUtility.TCPConnectionString))
@@ -236,7 +224,10 @@ void ActAndAssert(int index, string expectedHexString)
}
// Synapse: Parse error at line: 1, column: 41: Incorrect syntax near 'hierarchyid'.
- [ConditionalFact(nameof(IsSqlServerTypesUdtTestsEnabled))]
+ [ConditionalFact(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup), nameof(DataTestUtility.IsNotAzureSynapse))]
+ #if NETFRAMEWORK
+ [Trait("Category", "signed")] // Requires strong-name signed Microsoft.SqlServer.Server
+ #endif
public static void TestUdtSchemaMetadata()
{
using (SqlConnection connection = new SqlConnection(DataTestUtility.TCPConnectionString))
@@ -390,7 +381,10 @@ private static string GetUdtName(Type udtClrType)
}
// Synapse: Parse error at line: 1, column: 8: Incorrect syntax near 'geometry'.
- [ConditionalFact(nameof(IsSqlServerTypesUdtTestsEnabled))]
+ [ConditionalFact(typeof(DataTestUtility), nameof(DataTestUtility.AreConnStringsSetup), nameof(DataTestUtility.IsNotAzureSynapse))]
+ #if NETFRAMEWORK
+ [Trait("Category", "signed")] // Requires strong-name signed Microsoft.SqlServer.Server
+ #endif
public static void TestSqlServerTypesInsertAndRead()
{
string tableName = DataTestUtility.GetLongName("Type");
From 7306a00c797147b8814c2a6d2be8eb7bb0621bfd Mon Sep 17 00:00:00 2001
From: Paul Medynski <31868385+paulmedynski@users.noreply.github.com>
Date: Thu, 14 May 2026 17:19:14 -0300
Subject: [PATCH 08/22] Bump sibling package versions and fix Package-mode
dependency ordering
Version bumps (next preview):
- SqlServer: 1.0.0 -> 1.1.0-preview1
- Abstractions: 1.0.0 -> 1.1.0-preview1
- Logging: 1.0.0 -> 1.1.0-preview1
- Azure: 1.0.0 -> 1.1.0-preview1
- AKV Provider: 7.0.0 -> 7.1.0-preview1
This fixes NU1605 (package downgrade) errors in Package-mode CI builds
where Microsoft.SqlServer.Types >= 1.0.0 conflicts with the CI-produced
prerelease 1.0.0-ci* (prerelease sorts below stable in SemVer).
build.proj fixes:
- Reorder Package-mode DependsOn so PackLogging runs before
PackAbstractions (Abstractions has a PackageReference on Logging)
- Fix 'Encrpyted' typos in AKV section comments and messages
- Fix AkvProviderProjectpath casing
---
build.proj | 24 +++++++++----------
.../src/Versions.props | 2 +-
.../Abstractions/src/Versions.props | 2 +-
.../Azure/src/Versions.props | 2 +-
.../Logging/src/Versions.props | 2 +-
src/Microsoft.SqlServer.Server/Versions.props | 2 +-
6 files changed, 17 insertions(+), 17 deletions(-)
diff --git a/build.proj b/build.proj
index 23e3793645..fb2d1efa6d 100644
--- a/build.proj
+++ b/build.proj
@@ -288,13 +288,13 @@
Allowed values: (category_expression|none)
-->
category!=failing&category!=flaky&category!=interactive
+
- $(TestFilters)&category!=signed
-
+ $(TestFilters)&category!=signed
--filter "$(TestFilters)"
@@ -402,7 +402,7 @@
the first step of this target.
-->
- PackAbstractions;PackSqlServer
+ PackLogging;PackAbstractions;PackSqlServer
@@ -450,7 +450,7 @@
- PackAbstractions;PackSqlServer
+ PackLogging;PackAbstractions;PackSqlServer
@@ -479,7 +479,7 @@
- PackAbstractions;PackLogging;PackSqlServer
+ PackLogging;PackAbstractions;PackSqlServer
@@ -510,7 +510,7 @@
- PackAbstractions;PackLogging;PackSqlServer
+ PackLogging;PackAbstractions;PackSqlServer
@@ -691,14 +691,14 @@
-
+
$(RepoRoot)src/Microsoft.Data.SqlClient.AlwaysEncrypted.AzureKeyVaultProvider/
$(AkvProviderSrcRoot)src/Microsoft.Data.SqlClient.AlwaysEncrypted.AzureKeyVaultProvider.csproj
$(RepoRoot)artifacts/Microsoft.Data.SqlClient.AlwaysEncrypted.AzureKeyVaultProvider/$(Configuration)/
-
+
PackSqlClient;PackLogging
@@ -725,7 +725,7 @@
$([System.Text.RegularExpressions.Regex]::Replace($(DotnetCommand), "\s+", " "))
-
+
@@ -733,7 +733,7 @@
- "$(DotnetPath)dotnet" pack "$(AkvProviderProjectpath)"
+ "$(DotnetPath)dotnet" pack "$(AkvProviderProjectPath)"
-p:Configuration=$(Configuration)
$(PackBuildArgument)
$(SigningKeyPathArgument)
@@ -754,7 +754,7 @@
$([System.Text.RegularExpressions.Regex]::Replace($(DotnetCommand), "\s+", " "))
-
+
@@ -883,7 +883,7 @@
- PackAbstractions;PackLogging
+ PackLogging;PackAbstractions
diff --git a/src/Microsoft.Data.SqlClient.AlwaysEncrypted.AzureKeyVaultProvider/src/Versions.props b/src/Microsoft.Data.SqlClient.AlwaysEncrypted.AzureKeyVaultProvider/src/Versions.props
index 92cee863da..dd9ddc03d5 100644
--- a/src/Microsoft.Data.SqlClient.AlwaysEncrypted.AzureKeyVaultProvider/src/Versions.props
+++ b/src/Microsoft.Data.SqlClient.AlwaysEncrypted.AzureKeyVaultProvider/src/Versions.props
@@ -29,7 +29,7 @@
This is the *next* version to release of AkvProvider. Update this after a version is released.
@TODO: Determine how versions should be updated in release branches vs main
-->
- 7.0.0
+ 7.1.0-preview1
diff --git a/src/Microsoft.Data.SqlClient.Extensions/Abstractions/src/Versions.props b/src/Microsoft.Data.SqlClient.Extensions/Abstractions/src/Versions.props
index 5fddfb2df4..cc6d4ca14a 100644
--- a/src/Microsoft.Data.SqlClient.Extensions/Abstractions/src/Versions.props
+++ b/src/Microsoft.Data.SqlClient.Extensions/Abstractions/src/Versions.props
@@ -30,7 +30,7 @@
decided.
@TODO: Determine how versions should be updated in release branches vs main
-->
- 1.0.0
+ 1.1.0-preview1
diff --git a/src/Microsoft.Data.SqlClient.Extensions/Azure/src/Versions.props b/src/Microsoft.Data.SqlClient.Extensions/Azure/src/Versions.props
index 46688789bc..636face4e6 100644
--- a/src/Microsoft.Data.SqlClient.Extensions/Azure/src/Versions.props
+++ b/src/Microsoft.Data.SqlClient.Extensions/Azure/src/Versions.props
@@ -29,7 +29,7 @@
This is the *next* version to release of Azure. Update this when the next version is decided.
@TODO: Determine how versions should be updated in release branches vs main
-->
- 1.0.0
+ 1.1.0-preview1
diff --git a/src/Microsoft.Data.SqlClient.Internal/Logging/src/Versions.props b/src/Microsoft.Data.SqlClient.Internal/Logging/src/Versions.props
index fc1dafb33e..9d031d21d0 100644
--- a/src/Microsoft.Data.SqlClient.Internal/Logging/src/Versions.props
+++ b/src/Microsoft.Data.SqlClient.Internal/Logging/src/Versions.props
@@ -30,7 +30,7 @@
decided.
@TODO: Determine how versions should be updated in release branches vs main
-->
- 1.0.0
+ 1.1.0-preview1
diff --git a/src/Microsoft.SqlServer.Server/Versions.props b/src/Microsoft.SqlServer.Server/Versions.props
index 2a35868c7d..3615bd95a8 100644
--- a/src/Microsoft.SqlServer.Server/Versions.props
+++ b/src/Microsoft.SqlServer.Server/Versions.props
@@ -30,7 +30,7 @@
decided.
@TODO: Determine how versions should be updated in release branches vs main
-->
- 1.0.0
+ 1.1.0-preview1
From 5b3e87d36f0d02f29879b0b408b61ae06db35e3c Mon Sep 17 00:00:00 2001
From: Paul Medynski <31868385+paulmedynski@users.noreply.github.com>
Date: Fri, 15 May 2026 08:28:01 -0300
Subject: [PATCH 09/22] Updated CI package versions to match those in csproj.
---
.gitignore | 3 +++
.../templates/steps/run-all-tests-step.yml | 1 -
eng/pipelines/libraries/ci-build-variables.yml | 18 +++++++++---------
3 files changed, 12 insertions(+), 10 deletions(-)
diff --git a/.gitignore b/.gitignore
index 0d8dfed6d5..da143d57ac 100644
--- a/.gitignore
+++ b/.gitignore
@@ -376,3 +376,6 @@ MigrationBackup/
# MDS "Not Supported" GenAPI code
**/notsupported/*.cs
+
+# C# language server cache
+*.lscache
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 374c31c29a..5730b8cc0d 100644
--- a/eng/pipelines/common/templates/steps/run-all-tests-step.yml
+++ b/eng/pipelines/common/templates/steps/run-all-tests-step.yml
@@ -24,7 +24,6 @@ parameters:
- name: sqlServerPackageVersion
type: string
- default: $(sqlServerPackageVersion)
- name: platform
type: string
diff --git a/eng/pipelines/libraries/ci-build-variables.yml b/eng/pipelines/libraries/ci-build-variables.yml
index 142e5e21fe..438b011fab 100644
--- a/eng/pipelines/libraries/ci-build-variables.yml
+++ b/eng/pipelines/libraries/ci-build-variables.yml
@@ -24,35 +24,35 @@ variables:
# Abstractions library assembly file version
- name: abstractionsAssemblyFileVersion
- value: 1.0.0.$(assemblyBuildNumber)
+ value: 1.1.0.$(assemblyBuildNumber)
# Abstractions library NuGet package version
- name: abstractionsPackageVersion
- value: 1.0.0-ci$(Build.BuildNumber)
+ value: 1.1.0-preview1ci$(Build.BuildNumber)
# AKV provider assembly file version
- name: akvAssemblyFileVersion
- value: 7.0.0.$(assemblyBuildNumber)
+ value: 7.1.0.$(assemblyBuildNumber)
# AKV provider NuGet package version
- name: akvPackageVersion
- value: 7.0.0-ci$(Build.BuildNumber)
+ value: 7.1.0-preview1ci$(Build.BuildNumber)
# Azure library assembly file version
- name: azureAssemblyFileVersion
- value: 1.0.0.$(assemblyBuildNumber)
+ value: 1.1.0.$(assemblyBuildNumber)
# Azure library NuGet package version
- name: azurePackageVersion
- value: 1.0.0-ci$(Build.BuildNumber)
+ value: 1.1.0-preview1ci$(Build.BuildNumber)
# Logging library assembly file version
- name: loggingAssemblyFileVersion
- value: 1.0.0.$(assemblyBuildNumber)
+ value: 1.1.0.$(assemblyBuildNumber)
# Logging library NuGet package version
- name: loggingPackageVersion
- value: 1.0.0-ci$(Build.BuildNumber)
+ value: 1.1.0-preview1ci$(Build.BuildNumber)
# MDS library NuGet package version
# NOTE: This differs from the other structures! MdsVersions.props will deconstruct a provided
@@ -66,7 +66,7 @@ variables:
# assembly build number, so this must remain a three-part SemVer base with a prerelease
# suffix, not a four-part numeric version.
- name: sqlServerPackageVersion
- value: 1.0.0-ci$(AssemblyBuildNumber)
+ value: 1.1.0-preview1ci$(AssemblyBuildNumber)
# Local NuGet feed directory where downloaded pipeline artifacts are placed.
# NuGet.config references this as a local package source for restore.
From 3a1792ebaeaf3e102870333b782cb7376447e4d2 Mon Sep 17 00:00:00 2001
From: Paul Medynski <31868385+paulmedynski@users.noreply.github.com>
Date: Fri, 15 May 2026 09:33:47 -0300
Subject: [PATCH 10/22] Fix incorrect MSBuild property name in Azure test job
Change PackageVersionSqlServer to SqlServerPackageVersion in
test-azure-package-ci-job.yml. This job runs dotnet build directly
against Azure.Test.csproj (not build.proj), so the build.proj-level
PackageVersionSqlServer property was silently ignored. The csproj
consumes SqlServerPackageVersion via Directory.Packages.props and
Versions.props.
---
eng/pipelines/jobs/test-azure-package-ci-job.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/eng/pipelines/jobs/test-azure-package-ci-job.yml b/eng/pipelines/jobs/test-azure-package-ci-job.yml
index 770c69552a..d33c5c5dc5 100644
--- a/eng/pipelines/jobs/test-azure-package-ci-job.yml
+++ b/eng/pipelines/jobs/test-azure-package-ci-job.yml
@@ -169,7 +169,7 @@ jobs:
-p:ReferenceType=${{ parameters.referenceType }}
-p:AbstractionsPackageVersion=${{ parameters.abstractionsPackageVersion }}
-p:SqlClientPackageVersion=${{ parameters.mdsPackageVersion }}
- -p:PackageVersionSqlServer=${{ parameters.sqlServerPackageVersion }}
+ -p:SqlServerPackageVersion=${{ parameters.sqlServerPackageVersion }}
# Explicitly unset the $PLATFORM environment variable that is set by the
# 'ADO Build properties' Library in the ADO SqlClientDrivers public
From 6dc9da580282daaae8a6778af58311ac63a31b47 Mon Sep 17 00:00:00 2001
From: Paul Medynski <31868385+paulmedynski@users.noreply.github.com>
Date: Fri, 15 May 2026 11:56:37 -0300
Subject: [PATCH 11/22] Thread loggingPackageVersion through Azure test
pipeline
In Package mode, Azure.csproj depends on
Microsoft.Data.SqlClient.Internal.Logging via PackageReference, pinned by
LoggingPackageVersion in Directory.Packages.props. The Azure test job
downloaded Logging artifacts but never passed the version property, so
NuGet restore could pick a mismatched default version.
Add loggingPackageVersion parameter to test-azure-package-ci-job.yml and
thread it through build-azure-package-ci-stage.yml and
dotnet-sqlclient-ci-core.yml so Package-mode restores pin the correct
Logging version.
---
eng/pipelines/dotnet-sqlclient-ci-core.yml | 2 ++
.../jobs/test-azure-package-ci-job.yml | 8 +++++++
.../stages/build-azure-package-ci-stage.yml | 24 +++++++++++++++++++
3 files changed, 34 insertions(+)
diff --git a/eng/pipelines/dotnet-sqlclient-ci-core.yml b/eng/pipelines/dotnet-sqlclient-ci-core.yml
index 0de11238ec..f5f2269494 100644
--- a/eng/pipelines/dotnet-sqlclient-ci-core.yml
+++ b/eng/pipelines/dotnet-sqlclient-ci-core.yml
@@ -217,6 +217,8 @@ stages:
- build_sqlserver_package_stage
- build_sqlclient_package_stage
dotnetVerbosity: ${{ parameters.dotnetVerbosity }}
+ loggingArtifactsName: $(loggingArtifactsName)
+ loggingPackageVersion: $(loggingPackageVersion)
mdsArtifactsName: $(mdsArtifactsName)
mdsPackageVersion: $(mdsPackageVersion)
referenceType: ${{ parameters.referenceType }}
diff --git a/eng/pipelines/jobs/test-azure-package-ci-job.yml b/eng/pipelines/jobs/test-azure-package-ci-job.yml
index d33c5c5dc5..9c70433e33 100644
--- a/eng/pipelines/jobs/test-azure-package-ci-job.yml
+++ b/eng/pipelines/jobs/test-azure-package-ci-job.yml
@@ -26,6 +26,13 @@ parameters:
type: string
default: Logging.Artifacts
+ # The Logging package version to depend on.
+ #
+ # This is used when the referenceType is 'Package'.
+ - name: loggingPackageVersion
+ type: string
+ default: ''
+
# The Abstractions package verion to depend on.
#
# This is used when the referenceType is 'Package'.
@@ -168,6 +175,7 @@ jobs:
--verbosity ${{ parameters.dotnetVerbosity }}
-p:ReferenceType=${{ parameters.referenceType }}
-p:AbstractionsPackageVersion=${{ parameters.abstractionsPackageVersion }}
+ -p:LoggingPackageVersion=${{ parameters.loggingPackageVersion }}
-p:SqlClientPackageVersion=${{ parameters.mdsPackageVersion }}
-p:SqlServerPackageVersion=${{ parameters.sqlServerPackageVersion }}
diff --git a/eng/pipelines/stages/build-azure-package-ci-stage.yml b/eng/pipelines/stages/build-azure-package-ci-stage.yml
index 9fc42bf963..1da56a18ef 100644
--- a/eng/pipelines/stages/build-azure-package-ci-stage.yml
+++ b/eng/pipelines/stages/build-azure-package-ci-stage.yml
@@ -101,6 +101,20 @@ parameters:
- detailed
- diagnostic
+ # The name of the Logging pipeline artifacts to download.
+ #
+ # This is used when the referenceType is 'Package'.
+ - name: loggingArtifactsName
+ type: string
+ default: Logging.Artifacts
+
+ # The Logging package version to depend on.
+ #
+ # This is used when the referenceType is 'Package'.
+ - name: loggingPackageVersion
+ type: string
+ default: ''
+
# The name of the MDS pipeline artifacts to download.
#
# This is used when the referenceType is 'Package'.
@@ -167,6 +181,8 @@ stages:
displayNamePrefix: Linux
dotnetVerbosity: ${{ parameters.dotnetVerbosity }}
jobNameSuffix: linux
+ loggingArtifactsName: ${{ parameters.loggingArtifactsName }}
+ loggingPackageVersion: ${{ parameters.loggingPackageVersion }}
mdsArtifactsName: ${{ parameters.mdsArtifactsName }}
mdsPackageVersion: ${{ parameters.mdsPackageVersion }}
sqlServerArtifactsName: ${{ parameters.sqlServerArtifactsName }}
@@ -187,6 +203,8 @@ stages:
displayNamePrefix: Linux Integration
dotnetVerbosity: ${{ parameters.dotnetVerbosity }}
jobNameSuffix: linux_integration
+ loggingArtifactsName: ${{ parameters.loggingArtifactsName }}
+ loggingPackageVersion: ${{ parameters.loggingPackageVersion }}
mdsArtifactsName: ${{ parameters.mdsArtifactsName }}
mdsPackageVersion: ${{ parameters.mdsPackageVersion }}
sqlServerArtifactsName: ${{ parameters.sqlServerArtifactsName }}
@@ -216,6 +234,8 @@ stages:
displayNamePrefix: Win
dotnetVerbosity: ${{ parameters.dotnetVerbosity }}
jobNameSuffix: windows
+ loggingArtifactsName: ${{ parameters.loggingArtifactsName }}
+ loggingPackageVersion: ${{ parameters.loggingPackageVersion }}
mdsArtifactsName: ${{ parameters.mdsArtifactsName }}
mdsPackageVersion: ${{ parameters.mdsPackageVersion }}
sqlServerArtifactsName: ${{ parameters.sqlServerArtifactsName }}
@@ -236,6 +256,8 @@ stages:
displayNamePrefix: Win Integration
dotnetVerbosity: ${{ parameters.dotnetVerbosity }}
jobNameSuffix: windows_integration
+ loggingArtifactsName: ${{ parameters.loggingArtifactsName }}
+ loggingPackageVersion: ${{ parameters.loggingPackageVersion }}
mdsArtifactsName: ${{ parameters.mdsArtifactsName }}
mdsPackageVersion: ${{ parameters.mdsPackageVersion }}
sqlServerArtifactsName: ${{ parameters.sqlServerArtifactsName }}
@@ -274,6 +296,8 @@ stages:
displayNamePrefix: macOS
dotnetVerbosity: ${{ parameters.dotnetVerbosity }}
jobNameSuffix: macos
+ loggingArtifactsName: ${{ parameters.loggingArtifactsName }}
+ loggingPackageVersion: ${{ parameters.loggingPackageVersion }}
mdsArtifactsName: ${{ parameters.mdsArtifactsName }}
mdsPackageVersion: ${{ parameters.mdsPackageVersion }}
sqlServerArtifactsName: ${{ parameters.sqlServerArtifactsName }}
From ecbe841aadcb26c5be5e36a8cf3b54913b35d45a Mon Sep 17 00:00:00 2001
From: Paul Medynski <31868385+paulmedynski@users.noreply.github.com>
Date: Tue, 19 May 2026 10:17:10 -0300
Subject: [PATCH 12/22] Skipping the pack dependencies for Build* targets in
build.proj for OneBranch pipelines because they build/pack each package
independently.
---
build.proj | 27 ++++++++++++++-----
.../onebranch/steps/build-buildproj-step.yml | 1 +
.../steps/roslyn-analyzers-buildproj-step.yml | 1 +
3 files changed, 22 insertions(+), 7 deletions(-)
diff --git a/build.proj b/build.proj
index fb2d1efa6d..b8ac7d44ed 100644
--- a/build.proj
+++ b/build.proj
@@ -231,6 +231,19 @@
-p:ReferenceType=Package
+
+ false
+
- PackLogging;PackAbstractions;PackSqlServer
+ PackLogging;PackAbstractions;PackSqlServer
@@ -450,7 +463,7 @@
- PackLogging;PackAbstractions;PackSqlServer
+ PackLogging;PackAbstractions;PackSqlServer
@@ -479,7 +492,7 @@
- PackLogging;PackAbstractions;PackSqlServer
+ PackLogging;PackAbstractions;PackSqlServer
@@ -510,7 +523,7 @@
- PackLogging;PackAbstractions;PackSqlServer
+ PackLogging;PackAbstractions;PackSqlServer
@@ -700,7 +713,7 @@
- PackSqlClient;PackLogging
+ PackSqlClient;PackLogging
@@ -781,7 +794,7 @@
- PackLogging
+ PackLogging
@@ -883,7 +896,7 @@
- PackLogging;PackAbstractions
+ PackLogging;PackAbstractions
diff --git a/eng/pipelines/onebranch/steps/build-buildproj-step.yml b/eng/pipelines/onebranch/steps/build-buildproj-step.yml
index 9e02243537..080896ee10 100644
--- a/eng/pipelines/onebranch/steps/build-buildproj-step.yml
+++ b/eng/pipelines/onebranch/steps/build-buildproj-step.yml
@@ -56,6 +56,7 @@ steps:
-t:Build${{ parameters.packageShortName }}
-p:Configuration=${{ parameters.buildConfiguration }}
-p:ReferenceType=Package
+ -p:SkipDependencyPack=true
-p:SigningKeyPath="$(keyFile.secureFilePath)"
-p:BuildNumber="$(Build.BuildNumber)"
-p:PackageVersion${{ parameters.packageShortName }}="${{ parameters.packageVersion }}"
diff --git a/eng/pipelines/onebranch/steps/roslyn-analyzers-buildproj-step.yml b/eng/pipelines/onebranch/steps/roslyn-analyzers-buildproj-step.yml
index 1f7c22a554..89177f1d88 100644
--- a/eng/pipelines/onebranch/steps/roslyn-analyzers-buildproj-step.yml
+++ b/eng/pipelines/onebranch/steps/roslyn-analyzers-buildproj-step.yml
@@ -50,6 +50,7 @@ steps:
-t:Build${{ parameters.packageShortName }}
-p:Configuration=Release
-p:ReferenceType=Package
+ -p:SkipDependencyPack=true
-p:BuildNumber="$(Build.BuildNumber)"
-p:PackageVersion${{ parameters.packageShortName }}="${{ parameters.packageVersion }}"
${{ parameters.dependencyArguments }}
From 376eecb5994d14279f7c1c5c9ddfa49117c39bba Mon Sep 17 00:00:00 2001
From: Paul Medynski <31868385+paulmedynski@users.noreply.github.com>
Date: Tue, 19 May 2026 11:39:25 -0300
Subject: [PATCH 13/22] Add SqlServer artifact dependency to downstream
OneBranch jobs
SqlClient and AkvProvider now reference Microsoft.SqlServer.Server (directly
and transitively respectively). Add SqlServer to their dependencies lists in
build-stages.yml so the artifact is downloaded and its version is passed for
NuGet restore in Package mode.
---
eng/pipelines/onebranch/stages/build-stages.yml | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/eng/pipelines/onebranch/stages/build-stages.yml b/eng/pipelines/onebranch/stages/build-stages.yml
index 096da7e949..62f26b7aa3 100644
--- a/eng/pipelines/onebranch/stages/build-stages.yml
+++ b/eng/pipelines/onebranch/stages/build-stages.yml
@@ -222,6 +222,9 @@ stages:
- artifactName: '${{ parameters.loggingArtifactsName }}'
shortName: 'Logging'
version: '${{ parameters.loggingPackageVersion }}'
+ - artifactName: '${{ parameters.sqlServerArtifactsName }}'
+ shortName: 'SqlServer'
+ version: '${{ parameters.sqlServerPackageVersion }}'
fileVersion: '${{ parameters.sqlClientFileVersion }}'
packageFullName: 'Microsoft.Data.SqlClient'
packageShortName: 'SqlClient'
@@ -284,6 +287,9 @@ stages:
- artifactName: '${{ parameters.sqlClientArtifactsName }}'
shortName: 'SqlClient'
version: '${{ parameters.sqlClientPackageVersion }}'
+ - artifactName: '${{ parameters.sqlServerArtifactsName }}'
+ shortName: 'SqlServer'
+ version: '${{ parameters.sqlServerPackageVersion }}'
fileVersion: '${{ parameters.akvProviderFileVersion }}'
packageFullName: 'Microsoft.Data.SqlClient.AlwaysEncrypted.AzureKeyVaultProvider'
packageShortName: 'AkvProvider'
From d8ccb8d9210be8e1a4c83e5839e5c26427f7ad92 Mon Sep 17 00:00:00 2001
From: Paul Medynski <31868385+paulmedynski@users.noreply.github.com>
Date: Wed, 20 May 2026 12:33:16 -0300
Subject: [PATCH 14/22] Enable InternalsVisibleTo for test projects in Package
mode
---
build.proj | 34 ++++++++++---
.../src/Microsoft.Data.SqlClient.csproj | 15 +++++-
...Microsoft.Data.SqlClient.TestCommon.csproj | 12 ++++-
.../Microsoft.Data.SqlClient.UnitTests.csproj | 49 +++++++++++++++----
...rosoft.Data.SqlClient.TestUtilities.csproj | 8 +++
.../TDS/TDS.EndPoint/TDS.EndPoint.csproj | 9 ++++
.../tools/TDS/TDS.Servers/TDS.Servers.csproj | 6 +++
.../tests/tools/TDS/TDS/TDS.csproj | 6 +++
8 files changed, 119 insertions(+), 20 deletions(-)
diff --git a/build.proj b/build.proj
index b8ac7d44ed..3d9e13f394 100644
--- a/build.proj
+++ b/build.proj
@@ -259,6 +259,23 @@
-p:SigningKeyPath="$(SigningKeyPath)"
+
+
+
+ -p:TestSigningKeyPath="$(TestSigningKeyPath)"
+
+
-
SqlClientUnit-$(OS)
$(LogFilePrefix)-$(TestFramework)
@@ -692,6 +705,10 @@
$(TestCodeCoverageArgument)
$(TestFiltersArgument)
$(TestFrameworkArgument)
+ $(ReferenceTypeArgument)
+ $(TestSigningKeyPathArgument)
+ $(PackageVersionSqlClientArgument)
+ $(PackageVersionSqlServerArgument)
--results-directory "$(TestResultsFolderPath)"
--logger:"trx;LogFilePrefix=$(LogFilePrefix)"
@@ -860,10 +877,6 @@
-
AbstractionsTests-$(OS)
$(LogFilePrefix)-$(TestFramework)
@@ -874,6 +887,9 @@
$(TestCodeCoverageArgument)
$(TestFiltersArgument)
$(TestFrameworkArgument)
+ $(ReferenceTypeArgument)
+ $(TestSigningKeyPathArgument)
+ $(PackageVersionAbstractionsArgument)
--results-directory "$(TestResultsFolderPath)"
--logger:"trx;LogFilePrefix=$(LogFilePrefix)"
@@ -977,7 +993,9 @@
$(ReferenceTypeArgument)
+ $(TestSigningKeyPathArgument)
$(PackageVersionAbstractionsArgument)
+ $(PackageVersionAzureArgument)
$(PackageVersionLoggingArgument)
$(PackageVersionSqlClientArgument)
$(PackageVersionSqlServerArgument)
diff --git a/src/Microsoft.Data.SqlClient/src/Microsoft.Data.SqlClient.csproj b/src/Microsoft.Data.SqlClient/src/Microsoft.Data.SqlClient.csproj
index d7a7ef060a..24c6a548f9 100644
--- a/src/Microsoft.Data.SqlClient/src/Microsoft.Data.SqlClient.csproj
+++ b/src/Microsoft.Data.SqlClient/src/Microsoft.Data.SqlClient.csproj
@@ -62,13 +62,26 @@
-
+
+
<_Parameter1>UnitTests
+
+
+
+ <_Parameter1>UnitTests, PublicKey=00240000048000001401000006020000002400005253413100080000010001003D19684676DA365F331D00CE7BD4B8EF03E74102F39A5681B40622703D68F0298ECACECC723D3FFC1EA9365AF4958578550EA1EBEEC084B0B3757F3762449F5365E872802A4B548056760764FAD062BFEE81ED26183109AD46810E7E6E965419D0A10473680144D20C1BFE1027A5F586CA987523C06F5C126C44EA7D4F51EB023867A9F294315F95775ACEFD2D678186919458DFCCB4DE2E9F53AEFC766C7CBCEC474ED21C1616E5A9414D366D91D121C39F5FE6641295ADC058EF3FB10593BCDE2E82D9F217C2634909EEF496CD53AE78ABBEA572B871D72EBFC5378205950ABA97C7CCC2B9635D96933D5F9C9624D71FF53EE2094CF3A6BD38534D66E414B7
+
+
+
$(RepoRoot)artifacts/
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 71e4f305e1..548dd641f6 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
@@ -12,6 +12,13 @@
false
+
+
+
+ true
+ $(TestSigningKeyPath)
+
+
net8.0;net9.0;net10.0
@@ -26,7 +33,10 @@
-
+
+
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 82e900e54c..b9f460d9a7 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
@@ -36,22 +36,51 @@
+
+
+
+ true
+ $(TestSigningKeyPath)
+
+
-
-
+
-
-
-
+
+
+ <_SqlClientRid Condition="'$(OS)' != 'Windows_NT'">unix
+ <_SqlClientRid Condition="'$(OS)' == 'Windows_NT'">win
+
+ <_SqlClientPackageTfm Condition="'$(TargetFramework)' == 'net8.0'">net8.0
+ <_SqlClientPackageTfm Condition="'$(TargetFramework)' == 'net462'">net462
+ <_SqlClientPackageTfm Condition="'$(_SqlClientPackageTfm)' == ''">net9.0
+
+
+
+
+
+
+
+
diff --git a/src/Microsoft.Data.SqlClient/tests/tools/Microsoft.Data.SqlClient.TestUtilities/Microsoft.Data.SqlClient.TestUtilities.csproj b/src/Microsoft.Data.SqlClient/tests/tools/Microsoft.Data.SqlClient.TestUtilities/Microsoft.Data.SqlClient.TestUtilities.csproj
index 083cca8a61..c50a251e4f 100644
--- a/src/Microsoft.Data.SqlClient/tests/tools/Microsoft.Data.SqlClient.TestUtilities/Microsoft.Data.SqlClient.TestUtilities.csproj
+++ b/src/Microsoft.Data.SqlClient/tests/tools/Microsoft.Data.SqlClient.TestUtilities/Microsoft.Data.SqlClient.TestUtilities.csproj
@@ -2,6 +2,14 @@
netstandard2.0
+
+
+
+
+ true
+ $(TestSigningKeyPath)
+
+
diff --git a/src/Microsoft.Data.SqlClient/tests/tools/TDS/TDS.EndPoint/TDS.EndPoint.csproj b/src/Microsoft.Data.SqlClient/tests/tools/TDS/TDS.EndPoint/TDS.EndPoint.csproj
index 2e1a1b5c81..c9dce97ddb 100644
--- a/src/Microsoft.Data.SqlClient/tests/tools/TDS/TDS.EndPoint/TDS.EndPoint.csproj
+++ b/src/Microsoft.Data.SqlClient/tests/tools/TDS/TDS.EndPoint/TDS.EndPoint.csproj
@@ -3,6 +3,15 @@
Microsoft.SqlServer.TDS.EndPoint
Microsoft.SqlServer.TDS.EndPoint
netstandard2.0
+
+
+
+
+ true
+ $(TestSigningKeyPath)
+
+
+
false
diff --git a/src/Microsoft.Data.SqlClient/tests/tools/TDS/TDS.Servers/TDS.Servers.csproj b/src/Microsoft.Data.SqlClient/tests/tools/TDS/TDS.Servers/TDS.Servers.csproj
index 57d3dfadd2..b6f33b0977 100644
--- a/src/Microsoft.Data.SqlClient/tests/tools/TDS/TDS.Servers/TDS.Servers.csproj
+++ b/src/Microsoft.Data.SqlClient/tests/tools/TDS/TDS.Servers/TDS.Servers.csproj
@@ -4,6 +4,12 @@
Microsoft.SqlServer.TDS.Servers
netstandard2.0
+
+
+
+ true
+ $(TestSigningKeyPath)
+
diff --git a/src/Microsoft.Data.SqlClient/tests/tools/TDS/TDS/TDS.csproj b/src/Microsoft.Data.SqlClient/tests/tools/TDS/TDS/TDS.csproj
index a4da7c8b92..39d5aae2de 100644
--- a/src/Microsoft.Data.SqlClient/tests/tools/TDS/TDS/TDS.csproj
+++ b/src/Microsoft.Data.SqlClient/tests/tools/TDS/TDS/TDS.csproj
@@ -4,4 +4,10 @@
Microsoft.SqlServer.TDS
netstandard2.0
+
+
+
+ true
+ $(TestSigningKeyPath)
+
From 2463f9a70cf9008b1164e6122715fc23885bf105 Mon Sep 17 00:00:00 2001
From: Paul Medynski <31868385+paulmedynski@users.noreply.github.com>
Date: Wed, 20 May 2026 12:33:16 -0300
Subject: [PATCH 15/22] Pipeline: run unit tests in both Project and Package
modes
---
.../templates/steps/run-all-tests-step.yml | 156 ++++++++++--------
1 file changed, 86 insertions(+), 70 deletions(-)
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 5730b8cc0d..e41c7d22b2 100644
--- a/eng/pipelines/common/templates/steps/run-all-tests-step.yml
+++ b/eng/pipelines/common/templates/steps/run-all-tests-step.yml
@@ -79,51 +79,62 @@ steps:
condition: succeededOrFailed()
- ${{if eq(parameters.operatingSystem, 'Windows')}}:
- - ${{if eq(parameters.referenceType, 'Project')}}:
- - task: DotNetCoreCLI@2
- displayName: 'Run Unit Tests ${{parameters.msbuildArchitecture }}'
- condition: and(eq(variables['setupSucceeded'], 'true'), succeededOrFailed())
- inputs:
- command: build
- projects: build.proj
- ${{ if eq(parameters.msbuildArchitecture, 'x64') }}:
- arguments: >-
- -t:TestSqlClientUnit
- -p:TestFramework=${{ parameters.targetFramework }}
- -p:Configuration=${{ parameters.buildConfiguration }}
- -p:TestResultsFolderPath=TestResults
- ${{ else }}: # x86
- arguments: >-
- -t:TestSqlClientUnit
- -p:TestFramework=${{ parameters.targetFramework }}
- -p:Configuration=${{ parameters.buildConfiguration }}
- -p:DotnetPath=${{ parameters.dotnetx86RootPath }}
- -p:TestResultsFolderPath=TestResults
+ - task: DotNetCoreCLI@2
+ displayName: 'Run Unit Tests ${{parameters.msbuildArchitecture }}'
+ condition: and(eq(variables['setupSucceeded'], 'true'), succeededOrFailed())
+ inputs:
+ command: build
+ projects: build.proj
+ ${{ if eq(parameters.msbuildArchitecture, 'x64') }}:
+ arguments: >-
+ -t:TestSqlClientUnit
+ -p:TestFramework=${{ parameters.targetFramework }}
+ -p:ReferenceType=${{ parameters.referenceType }}
+ -p:Configuration=${{ parameters.buildConfiguration }}
+ -p:PackageVersionSqlClient=${{ parameters.mdsPackageVersion }}
+ -p:PackageVersionSqlServer=${{ parameters.sqlServerPackageVersion }}
+ -p:TestResultsFolderPath=TestResults
+ ${{ else }}: # x86
+ arguments: >-
+ -t:TestSqlClientUnit
+ -p:TestFramework=${{ parameters.targetFramework }}
+ -p:ReferenceType=${{ parameters.referenceType }}
+ -p:Configuration=${{ parameters.buildConfiguration }}
+ -p:PackageVersionSqlClient=${{ parameters.mdsPackageVersion }}
+ -p:PackageVersionSqlServer=${{ parameters.sqlServerPackageVersion }}
+ -p:DotnetPath=${{ parameters.dotnetx86RootPath }}
+ -p:TestResultsFolderPath=TestResults
- - task: DotNetCoreCLI@2
- displayName: 'Run Flaky Unit Tests ${{parameters.msbuildArchitecture }}'
- condition: and(eq(variables['setupSucceeded'], 'true'), succeededOrFailed())
- inputs:
- command: build
- projects: build.proj
- ${{ if eq(parameters.msbuildArchitecture, 'x64') }}:
- arguments: >-
- -t:TestSqlClientUnit
- -p:TestFramework=${{ parameters.targetFramework }}
- -p:Configuration=${{ parameters.buildConfiguration }}
- -p:TestFilters="category=flaky"
- -p:TestResultsFolderPath=TestResults
- -p:TestCodeCoverage=false
- ${{ else }}: # x86
- arguments: >-
- -t:TestSqlClientUnit
- -p:TestFramework=${{ parameters.targetFramework }}
- -p:Configuration=${{ parameters.buildConfiguration }}
- -p:DotnetPath=${{ parameters.dotnetx86RootPath }}
- -p:TestFilters="category=flaky"
- -p:TestResultsFolderPath=TestResults
- -p:TestCodeCoverage=false
- continueOnError: true
+ - task: DotNetCoreCLI@2
+ displayName: 'Run Flaky Unit Tests ${{parameters.msbuildArchitecture }}'
+ condition: and(eq(variables['setupSucceeded'], 'true'), succeededOrFailed())
+ inputs:
+ command: build
+ projects: build.proj
+ ${{ if eq(parameters.msbuildArchitecture, 'x64') }}:
+ arguments: >-
+ -t:TestSqlClientUnit
+ -p:TestFramework=${{ parameters.targetFramework }}
+ -p:ReferenceType=${{ parameters.referenceType }}
+ -p:Configuration=${{ parameters.buildConfiguration }}
+ -p:PackageVersionSqlClient=${{ parameters.mdsPackageVersion }}
+ -p:PackageVersionSqlServer=${{ parameters.sqlServerPackageVersion }}
+ -p:TestFilters="category=flaky"
+ -p:TestResultsFolderPath=TestResults
+ -p:TestCodeCoverage=false
+ ${{ else }}: # x86
+ arguments: >-
+ -t:TestSqlClientUnit
+ -p:TestFramework=${{ parameters.targetFramework }}
+ -p:ReferenceType=${{ parameters.referenceType }}
+ -p:Configuration=${{ parameters.buildConfiguration }}
+ -p:PackageVersionSqlClient=${{ parameters.mdsPackageVersion }}
+ -p:PackageVersionSqlServer=${{ parameters.sqlServerPackageVersion }}
+ -p:DotnetPath=${{ parameters.dotnetx86RootPath }}
+ -p:TestFilters="category=flaky"
+ -p:TestResultsFolderPath=TestResults
+ -p:TestCodeCoverage=false
+ continueOnError: true
- task: DotNetCoreCLI@2
displayName: 'Run Functional Tests ${{parameters.msbuildArchitecture }}'
@@ -261,33 +272,38 @@ steps:
continueOnError: true
- ${{ else }}: # Linux or macOS
- - ${{if eq(parameters.referenceType, 'Project')}}:
- - task: DotNetCoreCLI@2
- displayName: 'Run Unit Tests'
- condition: and(eq(variables['setupSucceeded'], 'true'), succeededOrFailed())
- inputs:
- command: build
- projects: build.proj
- arguments: >-
- -t:TestSqlClientUnit
- -p:TestFramework=${{ parameters.targetFramework }}
- -p:Configuration=${{ parameters.buildConfiguration }}
- -p:TestResultsFolderPath=TestResults
+ - task: DotNetCoreCLI@2
+ displayName: 'Run Unit Tests'
+ condition: and(eq(variables['setupSucceeded'], 'true'), succeededOrFailed())
+ inputs:
+ command: build
+ projects: build.proj
+ arguments: >-
+ -t:TestSqlClientUnit
+ -p:TestFramework=${{ parameters.targetFramework }}
+ -p:ReferenceType=${{ parameters.referenceType }}
+ -p:Configuration=${{ parameters.buildConfiguration }}
+ -p:PackageVersionSqlClient=${{ parameters.mdsPackageVersion }}
+ -p:PackageVersionSqlServer=${{ parameters.sqlServerPackageVersion }}
+ -p:TestResultsFolderPath=TestResults
- - task: DotNetCoreCLI@2
- displayName: 'Run Flaky Unit Tests'
- condition: and(eq(variables['setupSucceeded'], 'true'), succeededOrFailed())
- inputs:
- command: build
- projects: build.proj
- arguments: >-
- -t:TestSqlClientUnit
- -p:TestFramework=${{ parameters.targetFramework }}
- -p:Configuration=${{ parameters.buildConfiguration }}
- -p:TestFilters="category=flaky"
- -p:TestResultsFolderPath=TestResults
- -p:TestCodeCoverage=false
- continueOnError: true
+ - task: DotNetCoreCLI@2
+ displayName: 'Run Flaky Unit Tests'
+ condition: and(eq(variables['setupSucceeded'], 'true'), succeededOrFailed())
+ inputs:
+ command: build
+ projects: build.proj
+ arguments: >-
+ -t:TestSqlClientUnit
+ -p:TestFramework=${{ parameters.targetFramework }}
+ -p:ReferenceType=${{ parameters.referenceType }}
+ -p:Configuration=${{ parameters.buildConfiguration }}
+ -p:PackageVersionSqlClient=${{ parameters.mdsPackageVersion }}
+ -p:PackageVersionSqlServer=${{ parameters.sqlServerPackageVersion }}
+ -p:TestFilters="category=flaky"
+ -p:TestResultsFolderPath=TestResults
+ -p:TestCodeCoverage=false
+ continueOnError: true
- task: DotNetCoreCLI@2
displayName: 'Run Functional Tests'
From e91096e60c9a3520a406a3aa9e1b240f6606fe4e Mon Sep 17 00:00:00 2001
From: Paul Medynski <31868385+paulmedynski@users.noreply.github.com>
Date: Wed, 20 May 2026 13:09:18 -0300
Subject: [PATCH 16/22] Reverted some straggler leftover changes from previous
attempts.
---
build.proj | 9 ++++-----
1 file changed, 4 insertions(+), 5 deletions(-)
diff --git a/build.proj b/build.proj
index 3d9e13f394..38f82aac7c 100644
--- a/build.proj
+++ b/build.proj
@@ -877,6 +877,10 @@
+
AbstractionsTests-$(OS)
$(LogFilePrefix)-$(TestFramework)
@@ -887,9 +891,6 @@
$(TestCodeCoverageArgument)
$(TestFiltersArgument)
$(TestFrameworkArgument)
- $(ReferenceTypeArgument)
- $(TestSigningKeyPathArgument)
- $(PackageVersionAbstractionsArgument)
--results-directory "$(TestResultsFolderPath)"
--logger:"trx;LogFilePrefix=$(LogFilePrefix)"
@@ -993,9 +994,7 @@
$(ReferenceTypeArgument)
- $(TestSigningKeyPathArgument)
$(PackageVersionAbstractionsArgument)
- $(PackageVersionAzureArgument)
$(PackageVersionLoggingArgument)
$(PackageVersionSqlClientArgument)
$(PackageVersionSqlServerArgument)
From 900ed2528cb3397d0c8a3ebb2c41417ae6b59e17 Mon Sep 17 00:00:00 2001
From: Paul Medynski <31868385+paulmedynski@users.noreply.github.com>
Date: Thu, 14 May 2026 15:29:22 -0300
Subject: [PATCH 17/22] Added new sqlclient-package CI pipeline.
---
.../ci/package/sqlclient-package.yml | 181 ++++++++++++++++++
1 file changed, 181 insertions(+)
create mode 100644 eng/pipelines/ci/package/sqlclient-package.yml
diff --git a/eng/pipelines/ci/package/sqlclient-package.yml b/eng/pipelines/ci/package/sqlclient-package.yml
new file mode 100644
index 0000000000..1052ed3d33
--- /dev/null
+++ b/eng/pipelines/ci/package/sqlclient-package.yml
@@ -0,0 +1,181 @@
+#################################################################################
+# Licensed to the .NET Foundation under one or more agreements. #
+# The .NET Foundation licenses this file to you under the MIT license. #
+# See the LICENSE file in the project root for more information. #
+#################################################################################
+
+# This pipeline builds all packages using the build.proj Pack target with ReferenceType=Package,
+# then publishes the resulting .nupkg and .snupkg files as a single pipeline artifact.
+#
+# It runs:
+# - On pushes to GitHub main and ADO internal/main (batched)
+# - Nightly at 00:00 UTC on both branches
+#
+# On internal/main the strong-name signing key is downloaded and used to sign assemblies during the
+# build.
+#
+# GOTCHA: This pipeline definition is triggered by GitHub _and_ ADO CI. We distinguish the two via
+# branch filters:
+#
+# - Only the GitHub repo has a 'main' branch.
+# - Only the ADO repo has an 'internal/main' branch.
+
+name: $(DayOfYear)$(Rev:rr)
+
+# Do not trigger this pipeline for PRs.
+pr: none
+
+# Trigger on pushes to main and internal/main, batching concurrent commits.
+trigger:
+ batch: true
+ branches:
+ include:
+ - main
+ - internal/main
+
+# Nightly schedule at 00:00 UTC.
+schedules:
+ - cron: '0 0 * * *'
+ displayName: Nightly Build
+ branches:
+ include:
+ - main
+ - internal/main
+ always: true
+
+# Pipeline parameters visible in the Azure DevOps UI.
+parameters:
+
+ # The agent image to use for the build. This must exist in both the ADO-1ES-Pool and
+ # ADO-CI-1ES-Pool agent pools.
+ - name: agentImage
+ displayName: Agent Image
+ type: string
+ default: ADO-UB24
+ values:
+ - ADO-UB24
+ - ADO-Win25
+
+ # The build configuration to use, either Debug or Release.
+ - name: buildConfiguration
+ displayName: Build Configuration
+ type: string
+ default: Release
+ values:
+ - Debug
+ - Release
+
+ # True to enable debug steps and output.
+ - name: debug
+ displayName: Enable debug output
+ type: boolean
+ default: false
+
+ # The verbosity level of dotnet CLI commands.
+ - name: dotnetVerbosity
+ displayName: dotnet CLI Verbosity
+ type: string
+ default: normal
+ values:
+ - quiet
+ - minimal
+ - normal
+ - detailed
+ - diagnostic
+
+variables:
+ # Disable codesign validation injection for CI builds.
+ #
+ # TODO: Should we enable this for internal/main since those builds produce signed assemblies?
+ - name: runCodesignValidationInjection
+ value: false
+
+ # Skip component governance detection for CI builds.
+ #
+ # TODO: This should never be skipped, should it?
+ #- name: skipComponentGovernanceDetection
+ # value: true
+
+ # Whether this is an internal (ADO) build that should strong-name sign.
+ - name: isInternalBuild
+ value: ${{ startsWith(variables['Build.SourceBranch'], 'refs/heads/internal/') }}
+
+ # Package version suffix for CI builds.
+ - name: buildSuffix
+ value: ci
+
+jobs:
+ - job: pack_all_packages
+ displayName: Pack All Packages
+
+ pool:
+ ${{ if eq(variables.isInternalBuild, 'True') }}:
+ name: ADO-1ES-Pool
+ ${{ else }}:
+ name: ADO-CI-1ES-Pool
+ demands:
+ - ImageOverride -equals ${{ parameters.agentImage }}
+
+ steps:
+
+ # Emit environment variables if debug is enabled.
+ - ${{ if eq(parameters.debug, true) }}:
+ - pwsh: 'Get-ChildItem Env: | Sort-Object Name'
+ displayName: '[Debug] Print Environment Variables'
+
+ # Install the .NET SDK from global.json.
+ - template: /eng/pipelines/steps/install-dotnet.yml@self
+ parameters:
+ debug: ${{ parameters.debug }}
+
+ # Clean any pre-existing .nupkg / .snupkg files from the packages/ directory
+ # to ensure we only publish packages produced by this run.
+ - pwsh: |
+ Write-Host 'Cleaning packages/ directory...'
+ Remove-Item -Force "$(Build.SourcesDirectory)/packages/*.nupkg" -ErrorAction SilentlyContinue
+ Remove-Item -Force "$(Build.SourcesDirectory)/packages/*.snupkg" -ErrorAction SilentlyContinue
+ Write-Host 'Done.'
+ displayName: Clean packages/ directory
+
+ # On internal/main, download the strong-name signing key and setup assembly signing.
+ - ${{ if eq(variables.isInternalBuild, 'True') }}:
+ - task: DownloadSecureFile@1
+ displayName: Download Signing Key
+ inputs:
+ secureFile: netfxKeypair.snk
+ name: keyFile
+
+ - pwsh: |
+ Write-Host "##vso[task.setvariable variable=signingKeyArg]-p:SigningKeyPath=`"$(keyFile.secureFilePath)`""
+ displayName: Set Signing Key Argument
+
+ # Run the Pack target via build.proj.
+ # On internal/main the signing key path is included via $(signingKeyArg).
+ - task: DotNetCoreCLI@2
+ displayName: build.proj - Pack (ReferenceType=Package)
+ inputs:
+ command: build
+ projects: '$(Build.SourcesDirectory)/build.proj'
+ arguments: >-
+ -t:Pack
+ -p:Configuration=${{ parameters.buildConfiguration }}
+ -p:ReferenceType=Package
+ -p:BuildNumber="$(Build.BuildNumber)"
+ -p:BuildSuffix=$(buildSuffix)
+ $(signingKeyArg)
+ -verbosity:${{ parameters.dotnetVerbosity }}
+
+ # List produced packages for diagnostics.
+ - pwsh: |
+ Write-Host 'Packages produced:'
+ Get-ChildItem "$(Build.SourcesDirectory)/packages/*.nupkg" -ErrorAction SilentlyContinue | Format-Table Name, Length
+ Get-ChildItem "$(Build.SourcesDirectory)/packages/*.snupkg" -ErrorAction SilentlyContinue | Format-Table Name, Length
+ displayName: List produced packages
+
+ # Publish all .nupkg and .snupkg files from packages/ as a pipeline artifact.
+ - task: PublishPipelineArtifact@1
+ displayName: Publish NuGet Packages
+ inputs:
+ targetPath: '$(Build.SourcesDirectory)/packages'
+ artifactName: Packages
+ publishLocation: pipeline
From 21ad290d5c32432ce79e19d066d12883444cb0e3 Mon Sep 17 00:00:00 2001
From: Paul Medynski <31868385+paulmedynski@users.noreply.github.com>
Date: Thu, 14 May 2026 15:45:10 -0300
Subject: [PATCH 18/22] Updated pool choice to use the Azure DevOps project
name.
---
eng/pipelines/ci/package/sqlclient-package.yml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/eng/pipelines/ci/package/sqlclient-package.yml b/eng/pipelines/ci/package/sqlclient-package.yml
index 1052ed3d33..f85391d62f 100644
--- a/eng/pipelines/ci/package/sqlclient-package.yml
+++ b/eng/pipelines/ci/package/sqlclient-package.yml
@@ -96,9 +96,9 @@ variables:
#- name: skipComponentGovernanceDetection
# value: true
- # Whether this is an internal (ADO) build that should strong-name sign.
+ # Whether this is an internal (ADO.Net project) or public (Public project) build.
- name: isInternalBuild
- value: ${{ startsWith(variables['Build.SourceBranch'], 'refs/heads/internal/') }}
+ value: ${{ eq(variables['System.TeamProject'], 'ADO.Net') }}
# Package version suffix for CI builds.
- name: buildSuffix
From 2d0937c1022ba41ffb2a23680b325c043a6a05f4 Mon Sep 17 00:00:00 2001
From: Paul Medynski <31868385+paulmedynski@users.noreply.github.com>
Date: Thu, 14 May 2026 16:12:24 -0300
Subject: [PATCH 19/22] Add CI package pipeline for building and publishing
NuGet packages
---
eng/pipelines/ci/package/sqlclient-package.yml | 17 ++++++-----------
1 file changed, 6 insertions(+), 11 deletions(-)
diff --git a/eng/pipelines/ci/package/sqlclient-package.yml b/eng/pipelines/ci/package/sqlclient-package.yml
index f85391d62f..563d8ca8bb 100644
--- a/eng/pipelines/ci/package/sqlclient-package.yml
+++ b/eng/pipelines/ci/package/sqlclient-package.yml
@@ -87,14 +87,8 @@ variables:
# Disable codesign validation injection for CI builds.
#
# TODO: Should we enable this for internal/main since those builds produce signed assemblies?
- - name: runCodesignValidationInjection
- value: false
-
- # Skip component governance detection for CI builds.
- #
- # TODO: This should never be skipped, should it?
- #- name: skipComponentGovernanceDetection
- # value: true
+ #- name: runCodesignValidationInjection
+ # value: false
# Whether this is an internal (ADO.Net project) or public (Public project) build.
- name: isInternalBuild
@@ -120,7 +114,8 @@ jobs:
# Emit environment variables if debug is enabled.
- ${{ if eq(parameters.debug, true) }}:
- - pwsh: 'Get-ChildItem Env: | Sort-Object Name'
+ - pwsh: |
+ Get-ChildItem Env: | Sort-Object Name | Format-Table -AutoSize -Wrap
displayName: '[Debug] Print Environment Variables'
# Install the .NET SDK from global.json.
@@ -168,8 +163,8 @@ jobs:
# List produced packages for diagnostics.
- pwsh: |
Write-Host 'Packages produced:'
- Get-ChildItem "$(Build.SourcesDirectory)/packages/*.nupkg" -ErrorAction SilentlyContinue | Format-Table Name, Length
- Get-ChildItem "$(Build.SourcesDirectory)/packages/*.snupkg" -ErrorAction SilentlyContinue | Format-Table Name, Length
+ Get-ChildItem "$(Build.SourcesDirectory)/packages/*.nupkg" -ErrorAction SilentlyContinue | Format-Table Name, Length -AutoSize -Wrap
+ Get-ChildItem "$(Build.SourcesDirectory)/packages/*.snupkg" -ErrorAction SilentlyContinue | Format-Table Name, Length -AutoSize -Wrap
displayName: List produced packages
# Publish all .nupkg and .snupkg files from packages/ as a pipeline artifact.
From 60cfc11f94d0fc2450c58c6ea8622e99719088e5 Mon Sep 17 00:00:00 2001
From: Paul Medynski <31868385+paulmedynski@users.noreply.github.com>
Date: Thu, 14 May 2026 16:25:07 -0300
Subject: [PATCH 20/22] Address Copilot review: declare signingKeyArg
conditionally, remove dead code
---
.../ci/package/sqlclient-package.yml | 25 +++++++------------
1 file changed, 9 insertions(+), 16 deletions(-)
diff --git a/eng/pipelines/ci/package/sqlclient-package.yml b/eng/pipelines/ci/package/sqlclient-package.yml
index 563d8ca8bb..afc3388b1c 100644
--- a/eng/pipelines/ci/package/sqlclient-package.yml
+++ b/eng/pipelines/ci/package/sqlclient-package.yml
@@ -84,19 +84,17 @@ parameters:
- diagnostic
variables:
- # Disable codesign validation injection for CI builds.
- #
- # TODO: Should we enable this for internal/main since those builds produce signed assemblies?
- #- name: runCodesignValidationInjection
- # value: false
-
# Whether this is an internal (ADO.Net project) or public (Public project) build.
- name: isInternalBuild
value: ${{ eq(variables['System.TeamProject'], 'ADO.Net') }}
- # Package version suffix for CI builds.
- - name: buildSuffix
- value: ci
+ # Signing key argument passed to build.proj. On internal builds this references the secure file
+ # downloaded by DownloadSecureFile@1; on public builds it expands to empty.
+ - name: signingKeyArg
+ ${{ if eq(variables.isInternalBuild, 'True') }}:
+ value: '-p:SigningKeyPath="$(keyFile.secureFilePath)"'
+ ${{ else }}:
+ value: ''
jobs:
- job: pack_all_packages
@@ -132,7 +130,7 @@ jobs:
Write-Host 'Done.'
displayName: Clean packages/ directory
- # On internal/main, download the strong-name signing key and setup assembly signing.
+ # On internal builds, download the strong-name signing key.
- ${{ if eq(variables.isInternalBuild, 'True') }}:
- task: DownloadSecureFile@1
displayName: Download Signing Key
@@ -140,12 +138,7 @@ jobs:
secureFile: netfxKeypair.snk
name: keyFile
- - pwsh: |
- Write-Host "##vso[task.setvariable variable=signingKeyArg]-p:SigningKeyPath=`"$(keyFile.secureFilePath)`""
- displayName: Set Signing Key Argument
-
# Run the Pack target via build.proj.
- # On internal/main the signing key path is included via $(signingKeyArg).
- task: DotNetCoreCLI@2
displayName: build.proj - Pack (ReferenceType=Package)
inputs:
@@ -156,7 +149,7 @@ jobs:
-p:Configuration=${{ parameters.buildConfiguration }}
-p:ReferenceType=Package
-p:BuildNumber="$(Build.BuildNumber)"
- -p:BuildSuffix=$(buildSuffix)
+ -p:BuildSuffix=ci
$(signingKeyArg)
-verbosity:${{ parameters.dotnetVerbosity }}
From bef42ded02fe471052caf6ba1fe7c679127e469f Mon Sep 17 00:00:00 2001
From: Paul Medynski <31868385+paulmedynski@users.noreply.github.com>
Date: Thu, 14 May 2026 16:26:19 -0300
Subject: [PATCH 21/22] Exclude the new CI pipeline files from PR checks.
---
eng/pipelines/sqlclient-pr-package-ref-pipeline.yml | 1 +
eng/pipelines/sqlclient-pr-project-ref-pipeline.yml | 1 +
2 files changed, 2 insertions(+)
diff --git a/eng/pipelines/sqlclient-pr-package-ref-pipeline.yml b/eng/pipelines/sqlclient-pr-package-ref-pipeline.yml
index be7e2e9e3b..70a37e0fa7 100644
--- a/eng/pipelines/sqlclient-pr-package-ref-pipeline.yml
+++ b/eng/pipelines/sqlclient-pr-package-ref-pipeline.yml
@@ -51,6 +51,7 @@ pr:
- global.json
- NuGet.config
exclude:
+ - eng/pipelines/ci/*
- eng/pipelines/kerberos/*
- eng/pipelines/onebranch/*
- eng/pipelines/stress/*
diff --git a/eng/pipelines/sqlclient-pr-project-ref-pipeline.yml b/eng/pipelines/sqlclient-pr-project-ref-pipeline.yml
index 30950ec21c..f777626c90 100644
--- a/eng/pipelines/sqlclient-pr-project-ref-pipeline.yml
+++ b/eng/pipelines/sqlclient-pr-project-ref-pipeline.yml
@@ -51,6 +51,7 @@ pr:
- global.json
- NuGet.config
exclude:
+ - eng/pipelines/ci/*
- eng/pipelines/kerberos/*
- eng/pipelines/onebranch/*
- eng/pipelines/stress/*
From c07c7951da4f91be49c4074165ccd777680e4d56 Mon Sep 17 00:00:00 2001
From: Paul Medynski <31868385+paulmedynski@users.noreply.github.com>
Date: Wed, 20 May 2026 15:12:53 -0300
Subject: [PATCH 22/22] Address Copilot review: fix verbosity switch and
boolean comparisons
- Change -verbosity: to --verbosity for dotnet CLI consistency
- Change isInternalBuild comparisons from string 'True' to boolean true
---
eng/pipelines/ci/package/sqlclient-package.yml | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/eng/pipelines/ci/package/sqlclient-package.yml b/eng/pipelines/ci/package/sqlclient-package.yml
index afc3388b1c..c907fd0219 100644
--- a/eng/pipelines/ci/package/sqlclient-package.yml
+++ b/eng/pipelines/ci/package/sqlclient-package.yml
@@ -91,7 +91,7 @@ variables:
# Signing key argument passed to build.proj. On internal builds this references the secure file
# downloaded by DownloadSecureFile@1; on public builds it expands to empty.
- name: signingKeyArg
- ${{ if eq(variables.isInternalBuild, 'True') }}:
+ ${{ if eq(variables.isInternalBuild, true) }}:
value: '-p:SigningKeyPath="$(keyFile.secureFilePath)"'
${{ else }}:
value: ''
@@ -101,7 +101,7 @@ jobs:
displayName: Pack All Packages
pool:
- ${{ if eq(variables.isInternalBuild, 'True') }}:
+ ${{ if eq(variables.isInternalBuild, true) }}:
name: ADO-1ES-Pool
${{ else }}:
name: ADO-CI-1ES-Pool
@@ -131,7 +131,7 @@ jobs:
displayName: Clean packages/ directory
# On internal builds, download the strong-name signing key.
- - ${{ if eq(variables.isInternalBuild, 'True') }}:
+ - ${{ if eq(variables.isInternalBuild, true) }}:
- task: DownloadSecureFile@1
displayName: Download Signing Key
inputs:
@@ -151,7 +151,7 @@ jobs:
-p:BuildNumber="$(Build.BuildNumber)"
-p:BuildSuffix=ci
$(signingKeyArg)
- -verbosity:${{ parameters.dotnetVerbosity }}
+ --verbosity ${{ parameters.dotnetVerbosity }}
# List produced packages for diagnostics.
- pwsh: |