diff --git a/src/FirebirdSql.Data.FirebirdClient.Tests/FbDataReaderTests.cs b/src/FirebirdSql.Data.FirebirdClient.Tests/FbDataReaderTests.cs
index c87c804bc..c593d6b01 100644
--- a/src/FirebirdSql.Data.FirebirdClient.Tests/FbDataReaderTests.cs
+++ b/src/FirebirdSql.Data.FirebirdClient.Tests/FbDataReaderTests.cs
@@ -535,4 +535,18 @@ public async Task GetFieldValueTest()
await transaction.RollbackAsync();
}
}
+
+ [Test]
+ public async Task RecordsAffectedIsMinusOneForSelectTest()
+ {
+ // DbDataReader.RecordsAffected: "-1 for SELECT statements; 0 if no rows were affected or the statement failed."
+ await using (var command = new FbCommand("select INT_FIELD from TEST where 1 = 0", Connection))
+ {
+ var reader = await command.ExecuteReaderAsync();
+ while (await reader.ReadAsync())
+ { }
+ await reader.CloseAsync();
+ Assert.AreEqual(-1, reader.RecordsAffected);
+ }
+ }
}
diff --git a/src/FirebirdSql.Data.FirebirdClient/FirebirdClient/FbCommand.cs b/src/FirebirdSql.Data.FirebirdClient/FirebirdClient/FbCommand.cs
index 551c6ea64..f70580289 100644
--- a/src/FirebirdSql.Data.FirebirdClient/FirebirdClient/FbCommand.cs
+++ b/src/FirebirdSql.Data.FirebirdClient/FirebirdClient/FbCommand.cs
@@ -263,6 +263,24 @@ internal int RecordsAffected
}
}
+ ///
+ /// The rows an INSERT, UPDATE or DELETE affected, or -1 for any other statement (DbCommand.ExecuteNonQuery: "For all
+ /// other types of statements, the return value is -1"; DbDataReader.RecordsAffected: "-1 for SELECT statements").
+ ///
+ internal int StatementRecordsAffected
+ {
+ get
+ {
+ return _statement?.StatementType switch
+ {
+ DbStatementType.Insert => RecordsAffected,
+ DbStatementType.Update => RecordsAffected,
+ DbStatementType.Delete => RecordsAffected,
+ _ => -1,
+ };
+ }
+ }
+
internal bool IsDisposed
{
get { return _disposed; }
@@ -529,13 +547,7 @@ public override int ExecuteNonQuery()
}
}
- return _statement.StatementType switch
- {
- DbStatementType.Insert => RecordsAffected,
- DbStatementType.Update => RecordsAffected,
- DbStatementType.Delete => RecordsAffected,
- _ => -1,
- };
+ return StatementRecordsAffected;
}
public override async Task ExecuteNonQueryAsync(CancellationToken cancellationToken)
{
@@ -566,13 +578,7 @@ public override async Task ExecuteNonQueryAsync(CancellationToken cancellat
}
}
- return _statement.StatementType switch
- {
- DbStatementType.Insert => RecordsAffected,
- DbStatementType.Update => RecordsAffected,
- DbStatementType.Delete => RecordsAffected,
- _ => -1,
- };
+ return StatementRecordsAffected;
}
public new FbDataReader ExecuteReader() => ExecuteReader(CommandBehavior.Default);
diff --git a/src/FirebirdSql.Data.FirebirdClient/FirebirdClient/FbDataReader.cs b/src/FirebirdSql.Data.FirebirdClient/FirebirdClient/FbDataReader.cs
index 0cf1d40c4..1c9984af0 100644
--- a/src/FirebirdSql.Data.FirebirdClient/FirebirdClient/FbDataReader.cs
+++ b/src/FirebirdSql.Data.FirebirdClient/FirebirdClient/FbDataReader.cs
@@ -51,7 +51,7 @@ public sealed class FbDataReader : DbDataReader
private bool _eof;
private bool _isClosed;
private int _position;
- private int _recordsAffected;
+ private int _recordsAffected = -1;
private Dictionary _columnsIndexesOrdinal;
private Dictionary _columnsIndexesOrdinalCI;
@@ -1016,10 +1016,11 @@ private void UpdateRecordsAffected()
{
if (_command != null && !_command.IsDisposed)
{
- if (_command.RecordsAffected != -1)
+ var recordsAffected = _command.StatementRecordsAffected;
+ if (recordsAffected != -1)
{
_recordsAffected = _recordsAffected == -1 ? 0 : _recordsAffected;
- _recordsAffected += _command.RecordsAffected;
+ _recordsAffected += recordsAffected;
}
}
}