4 votes

<table> <tr> <td>jdbc ResultSet fermé</td> </tr> </table>

J'ai la source suivante.

Dans insertMessage(..), il appelle selectMessage pour vérifier si un enregistrement en double existe ou non.

Mais cette erreur se produit. Dans mon cerveau, ça fonctionne bien parce que la source de données me donne une nouvelle connexion...peut-être

java.sql.SQLException: ResultSet fermé
    at org.sqlite.RS.checkOpen(RS.java:63)
    at org.sqlite.RS.findColumn(RS.java:108)
    at org.sqlite.RS.getString(RS.java:317)
    at org.apache.commons.dbcp.DelegatingResultSet.getString(DelegatingResultSet.java:263)
    at org.apache.commons.dbcp.DelegatingResultSet.getString(DelegatingResultSet.java:263)
    at org.springframework.context.support.CachedMessageSourceDao.selectMessage(CachedMessageSourceDao.java:68)
    at org.springframework.context.support.CachedMessageSourceDao.insertMessage(CachedMessageSourceDao.java:94)
    at MessageSourceDemo.main(MessageSourceDemo.java:11)

public String selectMessage(String code, String language) {
    Connection conn = null;
    PreparedStatement pstmt = null;
    ResultSet rs = null;
    String value = null;

    String sql = "SELECT code, value, language FROM " + TABLE + " where code=? and language=? and flag = '" + FLAG_OK + "'";

    try {
        conn = dataSource.getConnection();
        conn.setAutoCommit(true);
        pstmt = conn.prepareStatement(sql);
        pstmt.setString(1, code);
        pstmt.setString(2, language);
        rs = pstmt.executeQuery();
        rs.next();

        String _code = rs.getString("code");
        String _value = rs.getString("value");
        String _language = rs.getString("language");
        Locale _locale = new Locale(_language);
        value = _value;

    } catch(SQLException ex) {

        ex.printStackTrace();

    } finally {

        try {
            if(rs != null);
            if(pstmt != null) pstmt.close();
            if(conn != null) conn.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }

    }
    return value;
}

public synchronized void insertMessage(String code, String value, String language) throws SQLException {
    //Vérification de message en double
    **if(selectMessage(code, language) != null) throw new SQLException("Un message en double existe pour le code : " + code + " et " + "le language : " + language);**

    String sql = "INSERT INTO " + TABLE + " (code, value, language, flag) values (?, ?, ?, '" + FLAG_OK + "')";

    Connection conn = null;
    PreparedStatement pstmt = null;

    try {
        conn = dataSource.getConnection();
        conn.setAutoCommit(true);
        pstmt = conn.prepareStatement(sql);
        pstmt.setString(1, code);
        pstmt.setString(2, value);
        pstmt.setString(3, language);
        pstmt.execute();

    } catch(SQLException ex) {

        ex.printStackTrace();

    } finally {

        try {

            if(pstmt != null) pstmt.close();
            if(conn != null) conn.close();

        } catch (SQLException e) {

            e.printStackTrace();

        }

    }

    notifyMessageChange(); //Application en temps réel à MessageSource
}

1voto

Fieldmouse Points 19

Consultez cette page.

public boolean next()
                 throws SQLException
    Déplace le curseur vers le bas d'une rangée à partir de sa position actuelle. Un curseur ResultSet est initialement positionné avant la première rangée; le premier appel à la méthode next rend la première rangée la rangée actuelle; le deuxième appel rend la deuxième rangée la rangée actuelle, et ainsi de suite.
    ***Si un flux d'entrée est ouvert pour la rangée actuelle, un appel à la méthode next le fermera implicitement.*** La chaîne d'avertissement d'un objet ResultSet est effacée lorsqu'une nouvelle rangée est lue.

    Renvoie:
    true si la nouvelle rangée actuelle est valide; false s'il n'y a plus de rangées
    Lance:
    SQLException - si une erreur d'accès à la base de données se produit

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X