From ae1c36cd0e1f1b88f5c888412c110f10a4c6ec75 Mon Sep 17 00:00:00 2001 From: Tianyi Chen Date: Fri, 31 May 2019 10:22:41 -0700 Subject: [PATCH] SNOW-76790 fetch RowsAffected earlier for dataReader so that this property can be available even if the connection/reader is closed (#136) --- Snowflake.Data.Tests/SFDbDataReaderIT.cs | 32 +++++++++++++++++++ Snowflake.Data/Client/SnowflakeDbCommand.cs | 2 -- .../Client/SnowflakeDbDataReader.cs | 4 ++- Snowflake.Data/Core/ResultSetUtil.cs | 2 ++ Snowflake.Data/Core/SFResultSet.cs | 2 -- 5 files changed, 37 insertions(+), 5 deletions(-) diff --git a/Snowflake.Data.Tests/SFDbDataReaderIT.cs b/Snowflake.Data.Tests/SFDbDataReaderIT.cs index 5d5162b5a..f9079bfa1 100755 --- a/Snowflake.Data.Tests/SFDbDataReaderIT.cs +++ b/Snowflake.Data.Tests/SFDbDataReaderIT.cs @@ -20,6 +20,38 @@ class SFDbDataReaderIT : SFBaseTest { static private readonly Random rand = new Random(); + [Test] + public void testRecordsAffected() + { + using (IDbConnection conn = new SnowflakeDbConnection()) + { + conn.ConnectionString = connectionString; + conn.Open(); + + IDbCommand cmd = conn.CreateCommand(); + cmd.CommandText = "create or replace table testRecordsAffected(cola number)"; + int count = cmd.ExecuteNonQuery(); + Assert.AreEqual(0, count); + + string insertCommand = "insert into testRecordsAffected values (1),(1),(1)"; + cmd.CommandText = insertCommand; + IDataReader reader = cmd.ExecuteReader(); + Assert.AreEqual(3, reader.RecordsAffected); + + // Reader's RecordsAffected should be available even if the reader is closed + reader.Close(); + Assert.AreEqual(3, reader.RecordsAffected); + + cmd.CommandText = "drop table if exists testRecordsAffected"; + count = cmd.ExecuteNonQuery(); + Assert.AreEqual(0, count); + + // Reader's RecordsAffected should be available even if the connection is closed + conn.Close(); + Assert.AreEqual(3, reader.RecordsAffected); + } + } + [Test] public void testGetNumber() { diff --git a/Snowflake.Data/Client/SnowflakeDbCommand.cs b/Snowflake.Data/Client/SnowflakeDbCommand.cs index 8b7b49455..475cec221 100755 --- a/Snowflake.Data/Client/SnowflakeDbCommand.cs +++ b/Snowflake.Data/Client/SnowflakeDbCommand.cs @@ -157,7 +157,6 @@ public override int ExecuteNonQuery() { logger.Debug($"ExecuteNonQuery, command: {CommandText}"); SFBaseResultSet resultSet = ExecuteInternal(); - resultSet.Next(); return resultSet.CalculateUpdateCount(); } @@ -168,7 +167,6 @@ public override async Task ExecuteNonQueryAsync(CancellationToken cancellat throw new TaskCanceledException(); var resultSet = await ExecuteInternalAsync(cancellationToken); - await resultSet.NextAsync(); return resultSet.CalculateUpdateCount(); } diff --git a/Snowflake.Data/Client/SnowflakeDbDataReader.cs b/Snowflake.Data/Client/SnowflakeDbDataReader.cs index ff901e737..51dd5cd7c 100755 --- a/Snowflake.Data/Client/SnowflakeDbDataReader.cs +++ b/Snowflake.Data/Client/SnowflakeDbDataReader.cs @@ -31,7 +31,9 @@ internal SnowflakeDbDataReader(SnowflakeDbCommand command, SFBaseResultSet resul this.resultSet = resultSet; this.isClosed = false; this.SchemaTable = PopulateSchemaTable(resultSet); + RecordsAffected = resultSet.CalculateUpdateCount(); } + public override object this[string name] { get @@ -82,7 +84,7 @@ public override bool IsClosed } } - public override int RecordsAffected => resultSet.CalculateUpdateCount(); + public override int RecordsAffected { get; } public override DataTable GetSchemaTable() { diff --git a/Snowflake.Data/Core/ResultSetUtil.cs b/Snowflake.Data/Core/ResultSetUtil.cs index 7fc816b4b..f6b335dac 100755 --- a/Snowflake.Data/Core/ResultSetUtil.cs +++ b/Snowflake.Data/Core/ResultSetUtil.cs @@ -25,6 +25,7 @@ internal static int CalculateUpdateCount(this SFBaseResultSet resultSet) case SFStatementType.DELETE: case SFStatementType.MERGE: case SFStatementType.MULTI_INSERT: + resultSet.Next(); for (int i = 0; i < resultSet.columnCount; i++) { updateCount += resultSet.GetValue(i); @@ -32,6 +33,7 @@ internal static int CalculateUpdateCount(this SFBaseResultSet resultSet) break; case SFStatementType.COPY: + resultSet.Next(); var index = resultSet.sfResultSetMetaData.getColumnIndexByName("rows_loaded"); if (index >= 0) updateCount = resultSet.GetValue(index); break; diff --git a/Snowflake.Data/Core/SFResultSet.cs b/Snowflake.Data/Core/SFResultSet.cs index 00fba878e..d5952c6ca 100755 --- a/Snowflake.Data/Core/SFResultSet.cs +++ b/Snowflake.Data/Core/SFResultSet.cs @@ -128,8 +128,6 @@ protected override string getObjectInternal(int columnIndex) throw new SnowflakeDbException(SFError.COLUMN_INDEX_OUT_OF_BOUND, columnIndex); } - //Logger.DebugFmt("RowIndex: {0}, ColumnIndex:{1}, CurrentChunkIndex: {2}, CurrentChunkRowCount: {3}", - // _currentChunkRowIdx, columnIndex, _currentChunk.GetChunkIndex(), _currentChunk.GetRowCount()); return _currentChunk.ExtractCell(_currentChunkRowIdx, columnIndex); }