ИНТЕРФЕЙС 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 2

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();

Добавление операторов результата внутри цикла while помогло в моем случае. while(rs.next) { rs.getString("your column name"); }