From 0046d3cd0ab58ba6fb2c30759447306ba223b71e Mon Sep 17 00:00:00 2001 From: Peter Bae Date: Wed, 15 Nov 2017 10:29:54 -0800 Subject: [PATCH 1/2] fix for 477 --- .../microsoft/sqlserver/jdbc/SQLServerResultSet.java | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerResultSet.java b/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerResultSet.java index e937b27c3..75066ea45 100644 --- a/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerResultSet.java +++ b/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerResultSet.java @@ -962,10 +962,12 @@ public boolean next() throws SQLServerException { // For scrollable cursors, next() is just a special case of relative() if (!isForwardOnly()) { - if (BEFORE_FIRST_ROW == currentRow) - moveFirst(); - else - moveForward(1); + do { + if (BEFORE_FIRST_ROW == currentRow) + moveFirst(); + else + moveForward(1); + } while (rowDeleted()); // repeat this if the row has been deleted beforehand, for scrollable resultsets. boolean value = hasCurrentRow(); loggerExternal.exiting(getClassNameLogging(), "next", value); return value; From c006af2603caf341e333dff93e995606d4d8d1ba Mon Sep 17 00:00:00 2001 From: Peter Bae Date: Wed, 15 Nov 2017 16:10:34 -0800 Subject: [PATCH 2/2] add check for updatable resultsets. --- .../com/microsoft/sqlserver/jdbc/SQLServerResultSet.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerResultSet.java b/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerResultSet.java index 75066ea45..45745eb49 100644 --- a/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerResultSet.java +++ b/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerResultSet.java @@ -967,7 +967,14 @@ public boolean next() throws SQLServerException { moveFirst(); else moveForward(1); - } while (rowDeleted()); // repeat this if the row has been deleted beforehand, for scrollable resultsets. + + // Only attempt rowDeleted() if result set is updatable. + try { + verifyResultSetIsUpdatable(); + } catch (SQLServerException e) { + break; + } + } while (rowDeleted()); // repeat this if the row has been deleted beforehand, for scrollable & updatable resultsets. boolean value = hasCurrentRow(); loggerExternal.exiting(getClassNameLogging(), "next", value); return value;