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; } } }