2014-01-03 3 views
2

Итак, решение, которое я создал, вызвало это исключение: jdbc.SQLServerException: The result set has no current row на строке, указанной в приведенном ниже коде.JDBC.SQLServerException: в результирующем наборе нет текущей строки

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) от объекта Entity берется непосредственно из той же таблицы. При использовании System.out.println(siteID); во время этого метода он объявлял, что число все равно будет правильным, то есть все еще 22379. Я проверил непосредственно с SQL-сервером, выполнив идентичный оператор в SQL Server, поэтому я знаю, что строка существует в таблице, но для по какой-то причине он не найден. Изображение ниже.

enter image description here

Так что проблема есть, ResultsSet rs не находит строку, даже если я знаю, что он там. У кого-нибудь есть полезная информация?

Уточнение: Просто, чтобы быть ясным, я знаю, что ResultsSet не содержит строк, и именно поэтому я получаю исключение. Я также знаю, что включение rs.next() в оператор if предотвратит исключение (как уже указано в комментариях). Меня озадачивает то, что тот факт, что ResultsSet не содержит строк, даже если строка с идентификатором, анализируемым на нем, достоверно существует, потому что я проверил его непосредственно с SQL-сервером.

+1

@JunedAhsan должно быть 'rs.next()' Я думаю, 'rs.hasNext()' нет в результирующем – SpringLearner

+2

@downvoter - Если есть проблема с моим вопросом я должен знать, что это является. Сдвиг на нем сам по себе не помогает. –

+0

Вы пытались поместить постоянное значение вместо 'siteID'? Подобно 'SELECT SitePicture FROM SiteTable WHERE SiteID = 42' или тому, что дает правильные результаты при выполнении непосредственно на SQL-сервере. –

ответ

3

Это оказалось локальной ошибкой, но я все равно отправлю решение, потому что эта ситуация имеет некоторую образовательную ценность.

Как я узнал из комментария @ Ralph к this answer, устранение «невозможного» - хороший способ для таких проблем.

После избежать риска siteID будучи неправильно (по его сюда вручную), мы имеем следующую ситуацию:

  • в точно такой же запрос работал в одной среде, но не других, ибо только один конкретный SiteID, 2184
  • это невозможно, что ResultSet просто не работает для это конкретное значение (I утверждают это, потому что Я всегда предполагать ошибки в моего кода, а не в языковых библиотеках)
  • если да, то базы данных должны отличаться
2

Наиболее вероятным объяснением является то, что ваш 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"); 

} 

EDIT:

какой тип столбца siteID? Ваш метод принимает int, но ваш SQL обертывает его в кавычки, как если бы это была строка.

EDIT 2:

Использование PreparedStatement может решить вашу проблему.

PreparedStatement ps = conn.prepareStatement("SELECT SitePicture FROM SiteTable WHERE SiteID = ?"); 
ps.setInt(1, siteId); 
ResultSet rs = ps.executeQuery(); 
+1

Вместо того, чтобы поместить параметр непосредственно в строку SQL (не рекомендуется в любом случае), попробуйте использовать заполнитель параметров в подготовленном операторе: http://docs.oracle.com/javase/tutorial/jdbc/basics/prepared.html – NickJ

+0

Отредактировано мое ответьте на пример PreparedStatement – NickJ

1

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

Смежные вопросы