Skip to content

Commit b37505e

Browse files
committed
Fix exception in FieldCount and HasRows. Fixes #728
1 parent 4bf3d69 commit b37505e

File tree

2 files changed

+46
-2
lines changed

2 files changed

+46
-2
lines changed

src/MySqlConnector/MySql.Data.MySqlClient/MySqlDataReader.cs

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -170,13 +170,32 @@ private async Task<int> ScanResultSetAsyncAwaited(IOBehavior ioBehavior, ResultS
170170

171171
public override bool IsDBNull(int ordinal) => GetResultSet().GetCurrentRow().IsDBNull(ordinal);
172172

173-
public override int FieldCount => GetResultSet().FieldCount;
173+
public override int FieldCount
174+
{
175+
get
176+
{
177+
VerifyNotDisposed();
178+
if (m_resultSet is null)
179+
throw new InvalidOperationException("There is no current result set.");
180+
return m_resultSet.ContainsCommandParameters ? 0 : m_resultSet.FieldCount;
181+
}
182+
}
174183

175184
public override object this[int ordinal] => GetResultSet().GetCurrentRow()[ordinal];
176185

177186
public override object this[string name] => GetResultSet().GetCurrentRow()[name];
178187

179-
public override bool HasRows => GetResultSet().HasRows;
188+
public override bool HasRows
189+
{
190+
get
191+
{
192+
VerifyNotDisposed();
193+
if (m_resultSet is null)
194+
throw new InvalidOperationException("There is no current result set.");
195+
return !m_resultSet.ContainsCommandParameters && m_resultSet.HasRows;
196+
}
197+
}
198+
180199
public override bool IsClosed => Command is null;
181200
public override int RecordsAffected => m_recordsAffected.GetValueOrDefault(-1);
182201

tests/SideBySide/StoredProcedureTests.cs

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,31 @@ public async Task StoredProcedureNoResultSet()
130130
Assert.Equal("test value", cmd.Parameters[0].Value);
131131
}
132132

133+
[SkippableFact(Baseline = "https://bugs.mysql.com/bug.php?id=97300")]
134+
public async Task FieldCountForNoResultSet()
135+
{
136+
using var cmd = m_database.Connection.CreateCommand();
137+
cmd.CommandText = "out_string";
138+
cmd.CommandType = CommandType.StoredProcedure;
139+
cmd.Parameters.Add(new MySqlParameter
140+
{
141+
ParameterName = "@value",
142+
DbType = DbType.String,
143+
Direction = ParameterDirection.Output,
144+
});
145+
146+
using (var reader = await cmd.ExecuteReaderAsync())
147+
{
148+
Assert.Equal(0, reader.FieldCount);
149+
Assert.False(reader.HasRows);
150+
Assert.False(await reader.ReadAsync());
151+
Assert.Equal(0, reader.FieldCount);
152+
Assert.False(reader.HasRows);
153+
}
154+
155+
Assert.Equal("test value", cmd.Parameters[0].Value);
156+
}
157+
133158
#if !NETCOREAPP1_1_2
134159
[SkippableFact(Baseline = "https://bugs.mysql.com/bug.php?id=97300")]
135160
public async Task GetSchemaTableForNoResultSet()

0 commit comments

Comments
 (0)