From 70d99c69822850a314f50c853463008720d0cb70 Mon Sep 17 00:00:00 2001 From: ralmsdeveloper Date: Thu, 31 Aug 2017 22:56:16 -0300 Subject: [PATCH] Solution for DNET-770 issue. INSERT (...) RETURNING (...) statement: * Works fine when using ExecuteScalar () * Does not work when using Executereader () http://tracker.firebirdsql.org/browse/DNET-770 --- .../Client/Managed/Version10/GdsStatement.cs | 10 ++++++++-- .../Client/Native/FesStatement.cs | 10 ++++++++-- .../FirebirdClient/FbCommand.cs | 6 +++++- 3 files changed, 21 insertions(+), 5 deletions(-) diff --git a/Provider/src/FirebirdSql.Data.FirebirdClient/Client/Managed/Version10/GdsStatement.cs b/Provider/src/FirebirdSql.Data.FirebirdClient/Client/Managed/Version10/GdsStatement.cs index 166765c92..a29a42fda 100644 --- a/Provider/src/FirebirdSql.Data.FirebirdClient/Client/Managed/Version10/GdsStatement.cs +++ b/Provider/src/FirebirdSql.Data.FirebirdClient/Client/Managed/Version10/GdsStatement.cs @@ -314,8 +314,14 @@ public override DbValue[] Fetch() { throw new InvalidOperationException("Statement is not correctly created."); } - if (_statementType != DbStatementType.Select && - _statementType != DbStatementType.SelectForUpdate) + if (_statementType == DbStatementType.StoredProcedure + && !_allRowsFetched && _state == StatementState.Executed + && _outputParams.Count > 0 && _fields.Count > 0) + { + _allRowsFetched = true; + return GetOutputParameters(); + } + else if (_statementType != DbStatementType.Select && _statementType != DbStatementType.SelectForUpdate) { return null; } diff --git a/Provider/src/FirebirdSql.Data.FirebirdClient/Client/Native/FesStatement.cs b/Provider/src/FirebirdSql.Data.FirebirdClient/Client/Native/FesStatement.cs index 5179b2e5d..87dcb48fa 100644 --- a/Provider/src/FirebirdSql.Data.FirebirdClient/Client/Native/FesStatement.cs +++ b/Provider/src/FirebirdSql.Data.FirebirdClient/Client/Native/FesStatement.cs @@ -365,8 +365,14 @@ public override DbValue[] Fetch() { throw new InvalidOperationException("Statement is not correctly created."); } - if (_statementType != DbStatementType.Select && - _statementType != DbStatementType.SelectForUpdate) + if (_statementType == DbStatementType.StoredProcedure + && !_allRowsFetched && _state == StatementState.Executed + && _outputParams.Count > 0 && _fields.Count > 0) + { + _allRowsFetched = true; + return GetOutputParameters(); + } + else if (_statementType != DbStatementType.Select && _statementType != DbStatementType.SelectForUpdate) { return null; } diff --git a/Provider/src/FirebirdSql.Data.FirebirdClient/FirebirdClient/FbCommand.cs b/Provider/src/FirebirdSql.Data.FirebirdClient/FirebirdClient/FbCommand.cs index f9bdc01bc..2f02f1c2d 100644 --- a/Provider/src/FirebirdSql.Data.FirebirdClient/FirebirdClient/FbCommand.cs +++ b/Provider/src/FirebirdSql.Data.FirebirdClient/FirebirdClient/FbCommand.cs @@ -287,7 +287,11 @@ internal bool HasImplicitTransaction internal bool IsSelectCommand { - get { return _statement != null && (_statement.StatementType == DbStatementType.Select || _statement.StatementType == DbStatementType.SelectForUpdate); } + get + { + return _statement != null && (_statement.StatementType == DbStatementType.Select || _statement.StatementType == DbStatementType.SelectForUpdate + || (_statement.StatementType == DbStatementType.StoredProcedure && _statement.Fields.Count > 0)); + } } internal bool IsDDLCommand