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 =