Набор результатов закрыт. Почему?

У меня небольшая проблема. Я запускаю свое приложение, и после запуска запроса и сравнения rs == null я получаю ошибку ResultSet is closed.

Вот код:

error_code = NO_ERROR;
    try
    {
        ArrayList <Harmonogram> al = new ArrayList <Harmonogram> ();
        ResultSet rs = stat.executeQuery(myQuery);
        if (rs == null)
        {
            return null;
        }else{
            Harmonogram harm = new Harmonogram(rs.getLong(1), rs.getInt(2), rs.getInt(3), rs.getInt(4), rs.getLong(5), rs.getString(6));

После этого я получаю SQLException сообщение: ResultSet is closed.


person Bulit    schedule 08.03.2012    source источник


Ответы (4)


Вы используете неправильный метод проверки наличия данных у ResultSet.

Вместо

if ( rs == null )
{
    return null;
}

использовать

if ( ! rs.next( ) )
{
    return null;
}
person Alexander Pogrebnyak    schedule 08.03.2012

javadoc для PreparedStatement.executeQuery() говорит:

"Возвращает: объект ResultSet, содержащий данные, созданные запросом; никогда не содержит null"

Правильный способ проверить наличие пустого ResultSet — это вызвать ResultSet.hasNext().

person Stephen C    schedule 08.03.2012

Вот как я рекомендую вам писать:

public class HarmonogramDaoImpl implements HarmonogramDao {

    private static final String FIND_ALL_SQL = "SELECT * FROM HARMONOGRAM ";

    // inject this with either a constructor or setter
    private Connection connection;



    public List<Harmonogram> findAllHarmonograms() throws SQLException {
        List<Harmonogram> harmonograms = new ArrayList<Harmonogram>();

        PreparedStatement ps = null;
        ResultSet rs = null;

        try {
            ps = this.connection.prepareStatement(FIND_ALL_SQL);
            rs = ps.executeQuery();
            while (rs.hasNext()) {
                Harmonogram harm = new Harmonogram(rs.getLong(1), rs.getInt(2), rs.getInt(3),      rs.getInt(4), rs.getLong(5), rs.getString(6));            
                harmonograms.add(harm);
            }
        } finally {
            close(rs);
            close(ps);
        }        
        return harmonograms;
    }
}

Вам осталось кое-что сделать или угадать, но это хорошее начало.

person duffymo    schedule 08.03.2012

я бы сделал что-то вроде

error_code = NO_ERROR;
try
{
    ArrayList <Harmonogram> al = new ArrayList <Harmonogram> ();
    ResultSet rs = stat.executeQuery(myQuery);
    if (rs.next()){
       Harmonogram harm = new Harmonogram(rs.getLong(1), rs.getInt(2), rs.getInt(3),      rs.getInt(4), rs.getLong(5), rs.getString(6));
    }else{
        return null;
    }
}Catch...

Или даже while(rs.next()), если вы пытаетесь перебрать набор результатов (получить все записи из базы данных)

person lcguida    schedule 08.03.2012