Skip to content

Commit 85292e5

Browse files
committed
fix(mssql): support multiple result sets in raw SQL ExecuteReaderAsync
1 parent 5a48e9b commit 85292e5

3 files changed

Lines changed: 19 additions & 6 deletions

File tree

Directory.Build.props

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,6 @@
77
<Authors>vkuttyp</Authors>
88
<PackageLicenseExpression>MIT</PackageLicenseExpression>
99
<RepositoryUrl>https://github.com/vkuttyp/CosmoSQLClient-Dotnet</RepositoryUrl>
10-
<Version>1.5.6</Version>
10+
<Version>1.5.7</Version>
1111
</PropertyGroup>
1212
</Project>

src/CosmoSQLClient.MsSql/MsSqlCommand.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -127,10 +127,10 @@ public override async Task<int> ExecuteNonQueryAsync(CancellationToken ct = defa
127127
}
128128
else
129129
{
130-
// Internal RunQueryAsync returns MsSqlResultSet (Cols + Rows)
131-
var rs = await ((MsSqlConnection)_connection).RunQueryAsync(_commandText, Parameters.ToCoreParameters(), cts.Token)
130+
// Execute multiple result sets if present in the raw SQL batch
131+
var rs = await ((MsSqlConnection)_connection).RunQueryAllAsync(_commandText, Parameters.ToCoreParameters(), cts.Token)
132132
.ConfigureAwait(false);
133-
return new MsSqlDataReader([rs]);
133+
return new MsSqlDataReader(rs);
134134
}
135135
}
136136

src/CosmoSQLClient.MsSql/MsSqlConnection.cs

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -677,7 +677,20 @@ await WritePacketsAsync(TdsPacketType.PreLogin, TdsPreLogin.BuildRequest(wantEnc
677677
_isOpen = true;
678678
}
679679

680-
// ── Internal query helpers ────────────────────────────────────────────────
680+
internal async Task<IReadOnlyList<SqlResultSet>> RunQueryAllAsync(
681+
string sql, IReadOnlyList<SqlParameter>? parameters, CancellationToken ct)
682+
{
683+
await _lock.WaitAsync(ct).ConfigureAwait(false);
684+
try
685+
{
686+
await SendSqlAsync(sql, parameters).ConfigureAwait(false);
687+
var payload = await ReceiveAsync(ct).ConfigureAwait(false);
688+
var tokens = TdsDecoder.Decode(payload);
689+
RaiseMessages(tokens);
690+
return GroupResultSetsWithColumns(tokens);
691+
}
692+
finally { _lock.Release(); }
693+
}
681694

682695
internal async Task<SqlResultSet> RunQueryAsync(
683696
string sql, IReadOnlyList<SqlParameter>? parameters, CancellationToken ct)
@@ -741,7 +754,7 @@ private async Task<SqlProcResult> RunProcAsync(
741754
}
742755

743756
/// <summary>Group a flat token list into per-result-set row lists using TdsDone as boundaries.</summary>
744-
private static IReadOnlyList<SqlResultSet> GroupResultSetsWithColumns(List<object> tokens)
757+
internal static IReadOnlyList<SqlResultSet> GroupResultSetsWithColumns(List<object> tokens)
745758
{
746759
var sets = new List<SqlResultSet>();
747760
var current = new List<SqlRow>();

0 commit comments

Comments
 (0)