From c6eb31fd881719f604ed2c503935b7b3f9a479c3 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 2 Apr 2026 19:06:06 +0000 Subject: [PATCH 1/2] Initial plan From e4be1303bb55eb585d34c9807721f39857bec621 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 2 Apr 2026 19:10:43 +0000 Subject: [PATCH 2/2] Address PR review feedback: cancellation handling, primary key, dead code removal Agent-Logs-Url: https://github.com/dotnet/SqlClient/sessions/9644d850-f130-470d-b04a-74c197d5d7cc Co-authored-by: paulmedynski <31868385+paulmedynski@users.noreply.github.com> --- .../src/Microsoft/Data/SqlClient/SqlCommand.cs | 11 +++++++++-- .../src/Microsoft/Data/SqlClient/SqlCommand.cs | 11 +++++++++-- .../MultipleResultsTest/MultipleResultsTest.cs | 4 ---- .../SqlCommand/SqlCommandExecuteScalarTest.cs | 18 +++++++++--------- 4 files changed, 27 insertions(+), 17 deletions(-) diff --git a/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/SqlClient/SqlCommand.cs b/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/SqlClient/SqlCommand.cs index e1367e5278..4da4308204 100644 --- a/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/SqlClient/SqlCommand.cs +++ b/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/SqlClient/SqlCommand.cs @@ -2915,8 +2915,15 @@ private Task InternalExecuteScalarAsync(CancellationToken cancellationTo } catch (Exception e) { - // exception thrown by Dispose... - source.SetException(e); + // exception thrown by Dispose or NextResultAsync cancellation... + if (e is OperationCanceledException && cancellationToken.IsCancellationRequested) + { + source.SetCanceled(); + } + else + { + source.SetException(e); + } } }, TaskScheduler.Default diff --git a/src/Microsoft.Data.SqlClient/netfx/src/Microsoft/Data/SqlClient/SqlCommand.cs b/src/Microsoft.Data.SqlClient/netfx/src/Microsoft/Data/SqlClient/SqlCommand.cs index dab51eee4c..b56d70dd05 100644 --- a/src/Microsoft.Data.SqlClient/netfx/src/Microsoft/Data/SqlClient/SqlCommand.cs +++ b/src/Microsoft.Data.SqlClient/netfx/src/Microsoft/Data/SqlClient/SqlCommand.cs @@ -3130,8 +3130,15 @@ private Task InternalExecuteScalarAsync(CancellationToken cancellationTo } catch (Exception e) { - // exception thrown by Dispose... - source.SetException(e); + // exception thrown by Dispose or NextResultAsync cancellation... + if (e is OperationCanceledException && cancellationToken.IsCancellationRequested) + { + source.SetCanceled(); + } + else + { + source.SetException(e); + } } }, TaskScheduler.Default diff --git a/src/Microsoft.Data.SqlClient/tests/ManualTests/ProviderAgnostic/MultipleResultsTest/MultipleResultsTest.cs b/src/Microsoft.Data.SqlClient/tests/ManualTests/ProviderAgnostic/MultipleResultsTest/MultipleResultsTest.cs index bf1551373b..77828f8ada 100644 --- a/src/Microsoft.Data.SqlClient/tests/ManualTests/ProviderAgnostic/MultipleResultsTest/MultipleResultsTest.cs +++ b/src/Microsoft.Data.SqlClient/tests/ManualTests/ProviderAgnostic/MultipleResultsTest/MultipleResultsTest.cs @@ -78,10 +78,6 @@ public void ExecuteScalar() { using SqlConnection connection = new SqlConnection((new SqlConnectionStringBuilder(DataTestUtility.TCPConnectionString) { MultipleActiveResultSets = true }).ConnectionString); using SqlCommand command = connection.CreateCommand(); - ConcurrentQueue messages = new ConcurrentQueue(); - - connection.InfoMessage += (object sender, SqlInfoMessageEventArgs args) => - messages.Enqueue(args.Message); connection.Open(); diff --git a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/SqlCommand/SqlCommandExecuteScalarTest.cs b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/SqlCommand/SqlCommandExecuteScalarTest.cs index 590657e5db..ae6a783d30 100644 --- a/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/SqlCommand/SqlCommandExecuteScalarTest.cs +++ b/src/Microsoft.Data.SqlClient/tests/ManualTests/SQL/SqlCommand/SqlCommandExecuteScalarTest.cs @@ -27,8 +27,8 @@ public static void ExecuteScalar_ShouldThrowOnConversionError() try { // Arrange - // Insert valid VARCHAR values - '42-43' is a valid string, not an invalid number - DataTestUtility.CreateTable(connection, tableName, "(Id INT IDENTITY(1,1) NOT NULL, Val VARCHAR(10) NOT NULL)"); + // Insert valid VARCHAR values - '42-43' is a valid string but not a valid number + DataTestUtility.CreateTable(connection, tableName, "(Id INT IDENTITY(1,1) NOT NULL PRIMARY KEY CLUSTERED, Val VARCHAR(10) NOT NULL)"); using (SqlCommand insertCmd = connection.CreateCommand()) { insertCmd.CommandText = @@ -68,9 +68,9 @@ public static void ExecuteScalar_TransactionShouldRollbackOnError() try { // Arrange - // sourceTable.Val is VARCHAR - both '12345' and '42-43' are valid strings - DataTestUtility.CreateTable(connection, sourceTable, "(Id INT IDENTITY(1,1) NOT NULL, Val VARCHAR(10) NOT NULL)"); - DataTestUtility.CreateTable(connection, targetTable, "(Id INT IDENTITY(1,1) NOT NULL, Val1 INT NOT NULL, Val2 INT NOT NULL)"); + // sourceTable.Val is VARCHAR - both '12345' and '42-43' are valid strings but not valid numbers + DataTestUtility.CreateTable(connection, sourceTable, "(Id INT IDENTITY(1,1) NOT NULL PRIMARY KEY CLUSTERED, Val VARCHAR(10) NOT NULL)"); + DataTestUtility.CreateTable(connection, targetTable, "(Id INT IDENTITY(1,1) NOT NULL PRIMARY KEY CLUSTERED, Val1 INT NOT NULL, Val2 INT NOT NULL)"); using (SqlCommand insertCmd = connection.CreateCommand()) { insertCmd.CommandText = @@ -165,7 +165,7 @@ public static async Task ExecuteScalarAsync_ShouldThrowOnConversionError() try { // Arrange - DataTestUtility.CreateTable(connection, tableName, "(Id INT IDENTITY(1,1) NOT NULL, Val VARCHAR(10) NOT NULL)"); + DataTestUtility.CreateTable(connection, tableName, "(Id INT IDENTITY(1,1) NOT NULL PRIMARY KEY CLUSTERED, Val VARCHAR(10) NOT NULL)"); using (SqlCommand insertCmd = connection.CreateCommand()) { insertCmd.CommandText = @@ -203,9 +203,9 @@ public static async Task ExecuteScalarAsync_TransactionShouldRollbackOnError() try { // Arrange - // sourceTable.Val is VARCHAR - both '12345' and '42-43' are valid strings - DataTestUtility.CreateTable(connection, sourceTable, "(Id INT IDENTITY(1,1) NOT NULL, Val VARCHAR(10) NOT NULL)"); - DataTestUtility.CreateTable(connection, targetTable, "(Id INT IDENTITY(1,1) NOT NULL, Val1 INT NOT NULL, Val2 INT NOT NULL)"); + // sourceTable.Val is VARCHAR - both '12345' and '42-43' are valid strings but not valid numbers + DataTestUtility.CreateTable(connection, sourceTable, "(Id INT IDENTITY(1,1) NOT NULL PRIMARY KEY CLUSTERED, Val VARCHAR(10) NOT NULL)"); + DataTestUtility.CreateTable(connection, targetTable, "(Id INT IDENTITY(1,1) NOT NULL PRIMARY KEY CLUSTERED, Val1 INT NOT NULL, Val2 INT NOT NULL)"); using (SqlCommand insertCmd = connection.CreateCommand()) { insertCmd.CommandText =