Erro Servlets + Firebird (RESOLVIDO)

1 resposta
J

Bom dia a todos

Um amigo me procurou para dar uma ajuda em um trabalho feito em java EE com firebird. Acontece que nunca havia mexido com firebird antes.

Criei a classe de conexão, que funciona normalmente

public class Conecta {
    public Connection conexao;
    public Statement statement;
    public Conecta() throws ClassNotFoundException, SQLException {
        try {           
            Class.forName("org.firebirdsql.jdbc.FBDriver");            
            conexao = DriverManager.getConnection("jdbc:firebirdsql:localhost/3050:C:/Estoque/estoque.fdb","SYSDBA","masterkey");            
            statement = (Statement) conexao.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);            
        } catch (SQLException e) {
            throw new SQLException(e.getMessage());
        } catch (ClassNotFoundException e) {
            throw new ClassNotFoundException(e.getMessage());
        }
    }

    public synchronized void executeUpdate(String SQL) throws SQLException  {
        try {
            statement.executeUpdate(SQL);
        } catch (SQLException e) {
            throw new SQLException(e.getMessage());
        }
    }

    public synchronized ResultSet executeQuery(String query) throws SQLException  {
        try {
            return statement.executeQuery(query);            
        } catch (SQLException e) {
            throw new SQLException(e.getMessage());
        }
    }

    public void fecharConexao() throws SQLException{
        try {          
            statement.close();
        } catch (SQLException e) {
            throw new SQLException(e.getMessage());
        }
    }
}

Consigo fazer selects no banco e exibi-los na jsp.

O problema ocorreu quando criei uma servlet para gravar dados no banco.

Conecta conexao = null;
        String nome = request.getParameter("nome");
        String email = request.getParameter("email");
        String senha = request.getParameter("senha");
        try {
            conexao = new Conecta();            
            ResultSet rs;            
            rs = conexao.executeQuery("SELECT * FROM usuario");
            
            rs.moveToInsertRow();
            rs.updateString("nome", nome);
            rs.updateString("e-mail", email);
            rs.updateString("senha", senha);
            rs.updateRow();                        
            rs.close();                       
            conexao.fecharConexao();        
        } catch(SQLException ex){
            Logger.getLogger(GravaUsuario.class.getName()).log(Level.SEVERE, null, ex);
        } catch (ClassNotFoundException ex) {
                Logger.getLogger(GravaUsuario.class.getName()).log(Level.SEVERE, null, ex);            
        }
        response.sendRedirect("usuario.jsp?pesq=0");

Ao executar, está retornando o seguinte erro:

GRAVE: Servlet.service() for servlet [GravaUsuario] in context with path [/luiz] threw exception
java.lang.IllegalStateException: Cannot call sendRedirect() after the response has been committed
	at org.apache.catalina.connector.ResponseFacade.sendRedirect(ResponseFacade.java:483)
	at servlets.GravaUsuario.doPost(GravaUsuario.java:101)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:641)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:225)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
	at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
	at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1001)
	at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:585)
	at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:1770)
	at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
	at java.lang.Thread.run(Thread.java:662)

e

GRAVE: null
    org.firebirdsql.jdbc.FBSQLException: Only insertRow() is allowed when result set is positioned on insert row.
	at org.firebirdsql.jdbc.FBRowUpdater.executeStatement(FBRowUpdater.java:534)
	at org.firebirdsql.jdbc.FBRowUpdater.updateRow(FBRowUpdater.java:416)
	at org.firebirdsql.jdbc.AbstractResultSet.updateRow(AbstractResultSet.java:2500)
	at servlets.GravaUsuario.doPost(GravaUsuario.java:91)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:641)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:225)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
	at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
	at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1001)
	at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:585)
	at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:1770)
	at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
	at java.lang.Thread.run(Thread.java:662)

Alguém pode me ajudar, pois não encontrei a raiz do problema.

abraços

1 Resposta

J

Resolvido.

Andei lendo a documentação do jaybird, e descobri que quando utilizamos o .MoveToinsertRow() não podemos dar um updateRow, é necessário utilizar o rs.insertRow()

Também encontrei um erro no banco, que tinha um campo chamado “E-MAIL”, e o “-” gerava erros na hora de gravar. Alterei o nome do campo para EMAIL e funcionou corretamente.
Particularmente, ainda prefiro o MySQL e o PostgreSQL

Caso alguém precise, segue a classe e a servlet funcionando.
Lembrando que é necessário adicionar o jar do JayBird na sua aplicação.

package conexao;
import java.sql.*;
public class Conecta {
    public Connection conexao;
    public Statement statement;
    public Conecta() throws ClassNotFoundException, SQLException {
        try {
            Class.forName("org.firebirdsql.jdbc.FBDriver");
            conexao = DriverManager.getConnection("jdbc:firebirdsql:localhost/3050:C:/Estoque/estoque.fdb","SYSDBA","masterkey");            
            statement = (Statement) conexao.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);            
        } catch (SQLException e) {
            throw new SQLException(e.getMessage());
        } catch (ClassNotFoundException e) {
            throw new ClassNotFoundException(e.getMessage());
        }
    }

    public synchronized void executeUpdate(String SQL) throws SQLException  {
        try {
            statement.executeUpdate(SQL);
        } catch (SQLException e) {
            throw new SQLException(e.getMessage());
        }
    }

    public synchronized ResultSet executeQuery(String query) throws SQLException  {
        try {
            return statement.executeQuery(query);            
        } catch (SQLException e) {
            throw new SQLException(e.getMessage());
        }
    }

    public void fecharConexao() throws SQLException{
        try {          
            statement.close();
        } catch (SQLException e) {
            throw new SQLException(e.getMessage());
        }
    }
}
package servlets;
import conexao.Conecta;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class GravaUsuario extends HttpServlet {
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {        
    }
    
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
        response.setContentType("text/plain");        
        Conecta conexao = null;
        String nome = request.getParameter("nome");
        String email = request.getParameter("email");
        String senha = request.getParameter("senha");
        
        try {
            conexao = new Conecta();            
            ResultSet rs;            
            rs = conexao.executeQuery("SELECT * FROM usuario");            
            rs.moveToInsertRow();            
            rs.updateString("nome", nome);
            rs.updateString("email", email);
            rs.updateString("senha", senha);
            rs.insertRow();                       
            rs.close();            
            conexao.fecharConexao();        
        } catch(SQLException ex){
            Logger.getLogger(GravaUsuario.class.getName()).log(Level.SEVERE, null, ex);
        } catch (ClassNotFoundException ex) {
                Logger.getLogger(GravaUsuario.class.getName()).log(Level.SEVERE, null, ex);            
        }
        response.sendRedirect("usuario.jsp?pesq=0");     
    }

    @Override
    public String getServletInfo() {
        return "Short description";
    }
}
Criado 18 de dezembro de 2012
Ultima resposta 18 de dez. de 2012
Respostas 1
Participantes 1