ИНТЕРФЕЙС JDBC.SQLServerException: результирующий набор не имеет текущей строки
Итак, решение, которое я создал, выбросило это исключение: jdbc.SQLServerException: The result set has no current row
на строку, отмеченную в приведенном ниже коде.
public String get64BitEncodedImageBySiteID(int siteID){
try {
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
Connection conn = DriverManager.getConnection(url, userName, password);
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery( "SELECT SitePicture FROM SiteTable WHERE SiteID ="+siteID );
rs.next();
// The above line has since been moved to the if statement below where you can see it commented out,
// which prevents the exception from occuring but still doesn't fix the fact that the row is not being found.
if(/*rs.next() &&*/ rs.getBytes("SitePicture")!=null){ // EXCEPTION THROWN HERE!
byte ba[] = rs.getBytes("SitePicture");
return new sun.misc.BASE64Encoder().encodeBuffer(ba);
}
else {return null;}
} catch (Exception ex) {
ex.printStackTrace();
}
return null;
}
Метод выше, в том случае, когда исключение было вызвано, принимает подлинный siteID (22379) из объекта сущности, извлеченного непосредственно из той же таблицы. При использовании System.out.println(siteID);
во время этого метода он объявил, что число все еще правильно, т. е. все еще 22379. Я проверил непосредственно с SQL server, запустив идентичный оператор в SQL Server, поэтому я знаю, что строка существует в SQL Server. стол, но почему-то его не находят. Изображение ниже.
Итак, проблема в том, что ResultsSet rs
не находит строку, хотя я знаю, что она есть. Есть ли у кого-нибудь полезные идеи?
Уточнение: просто чтобы быть ясным, я знаю, что ResultsSet не содержит строк, и именно поэтому я получаю исключение. Я также знаю, что ставлю rs.next () В оператор if предотвратит исключение (как уже говорилось в комментариях). Что меня озадачивает тот факт, что ResultsSet не содержит строк, даже если строка с идентификатором, анализируемым для нее, верифицируемо существует, потому что я проверил ее непосредственно с SQL server.
3 ответа:
Это оказалось локальной ошибкой, но я все равно опубликую решение, потому что эта ситуация имеет некоторую образовательную ценность.
Как я узнал из комментария @Ralph к этому ответу, устранение "невозможного" является хорошим способом для таких проблем.
Избежав риска того, что
siteID
ошибется (путем жесткого кодирования), мы имеем следующую ситуацию:
- тот же самый точный запрос работал в одной среде, но не в другой, только для одного конкретного
SiteID
, 2184- невозможно, чтобы
ResultSet
Просто не работал для этого конкретного значения (я утверждаю, потому что я всегда предполагаю, что ошибки находятся в моем коде, а не в языковых библиотеках)- Если это так, то базы данных должны отличаться
Наиболее вероятное объяснение заключается в том, что ваш результирующий набор не содержит строк. Вы это проверили?
Если это так,
rs.next()
вернет false, но вы больше не проверяете возвращаемое значение. Поместитеrs.next()
обратно в блок if, там все было в порядке.Вы можете убедиться, что:
if (rs.next()) { if(rs.getBytes("SitePicture")!=null){ byte ba[] = rs.getBytes("SitePicture"); return new sun.misc.BASE64Encoder().encodeBuffer(ba); } } else { System.out.println("No rows returned"); }
Правка:
Какой тип столбца является siteID? Ваш метод принимает значение int, но ваш SQL заключает его в кавычки, как если бы это была строка.
Правка 2:
Использование PreparedStatement это может решить вашу проблему.
PreparedStatement ps = conn.prepareStatement("SELECT SitePicture FROM SiteTable WHERE SiteID = ?"); ps.setInt(1, siteId); ResultSet rs = ps.executeQuery();