ResultSet закрыт. Зачем? - PullRequest
       4

ResultSet закрыт. Зачем?

0 голосов
/ 08 марта 2012

У меня небольшая проблема. Я запускаю свое приложение и после запуска запроса и сравнения 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.

Ответы [ 4 ]

7 голосов
/ 08 марта 2012

Вы используете неправильный метод проверки, есть ли у ResultSet какие-либо данные.

Вместо

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

используйте

if ( ! rs.next( ) )
{
    return null;
}
3 голосов
/ 08 марта 2012

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

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

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

2 голосов
/ 08 марта 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;
    }
}

Есть несколько вещей, которые вы можете сделать или угадать, но это хорошее начало.

1 голос
/ 08 марта 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()), если вы пытаетесь перебрать результирующий набор (получить все записи из базы данных)

...