Erro ao utilizar servlet, sql sever e JDBC [RESOLVIDO]

2 respostas
P

Olá, estou fazendo um exercício da caelum fj21 e gostaria que vocês me ajudassem a resolver um erro. Antes de tudo estou usando o sql sever(algumas pessoas me indicaram usar o mysql, mas eu prefiro utilizar o sql sever mesmo.) e o apache tomcat 7.

o exercício é bem simples: uma pagina html foi criada para inserir dados no banco de dados através de uma servlet e uma classe DAO/JDBC. Eu testei a conexão e a classe DAO inserindo dados através de uma classe principal (sem servlet) e funcionou normalmente. Testei o servlet sem usar o banco de dados (fazendo que os dados enviados na requisição fossem escritos na pagina html de response) e também funcionou normalmente. Porém, quando adiciono a os parametros do requeste na classe DAO aparece o seguinte erro: execeção:
java.lang.RuntimeException: com.microsoft.sqlserver.jdbc.SQLServerException: Must declare the scalar variable "@P0@P1@P2"

abaixo segue o código completo:

Classe conectionFactory:
public class ConnectionFactory {
    String connectURL="jdbc:sqlserver://localhost:1433;databaseName=Agenda;";
    String user="sa";
    String password="12345";
    public Connection getConnection(){
        try{
            return DriverManager.getConnection(connectURL,user,password);
        }catch(SQLException e){
            throw new RuntimeException(e);
        }
        
    }
    
}

a classe DAO:

public class ContatoDAO {
    private Connection connection;
    public ContatoDAO(){
        this.connection=new ConnectionFactory().getConnection();   
    }
    
    public void adicionaContato(Contato contatos){
        String sql="insert into Contato(nome,endereco,email,dataNascimento)"
                + "values(?,?,?,?)";
        
        try{
            PreparedStatement stmt = connection.prepareStatement(sql);
            
            stmt.setString(1,contatos.getNome());
            stmt.setString(2, contatos.getEndereco());
            stmt.setString(3, contatos.getEmail());
            stmt.setDate(4, new Date(contatos.getDataNascimento().getTimeInMillis()));
            
            //executa
            
            stmt.execute();
            stmt.close();
            connection.close();                       
            
        }catch(SQLException e){
            System.out.println("Erro ao adicionar contato");
            throw new RuntimeException(e);
        }
        
    } 
}

o servlet:

public class AdicionacontatoServlet extends HttpServlet{
    protected void service(HttpServletRequest request,HttpServletResponse response)
    throws IOException, ServletException{
        
        PrintWriter out = response.getWriter();
        
        // pegando os parâmetros do request
        
        String nome = request.getParameter("nome");
        String endereco= request.getParameter("endereco");
        String email= request.getParameter("email");
        String dataTexto = request.getParameter("dataNascimento");
        Calendar dataNascimento=null;
        
        //fazendo a converção da data
        
        try {
            Date date= new SimpleDateFormat("dd/MM/yy").parse(dataTexto);
            dataNascimento= Calendar.getInstance();
            dataNascimento.setTime(date);
        } catch (ParseException e) {
            out.println("Erro de conversão de data");
            return;
        }
        
        //montar o objeto contato
        
        Contato contato=new Contato();
        contato.setNome(nome);
        contato.setEndereco(endereco);
        contato.setEmail(email);
        contato.setDataNascimento(dataNascimento);
        
        //salva o contato
        
        ContatoDAO dao= new ContatoDAO();
        dao.adicionaContato(contato);
        
        out.println("<html>");
        out.println("Contato " + contato.getNome() +
        " adicionado com sucesso");
        out.println("</body>");
        out.println("</html>");
    }
    
}
a pagina HTM:

<html>
    <head>
        <title></title>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    </head>
    <body>
        <div><form action="adicionaContato">
Nome: <input type="text" name="nome" /><br />
E-mail: <input type="text" name="email" /><br />
Endereço: <input type="text" name="endereco" /><br />
Data Nascimento: <input type="text" name="dataNascimento" /><br />
<input type="submit" value="Gravar" /></div>
    </body>
</html>

e no final a exceção que escrevi no inicio:

desde já agradeço.

2 Respostas

g4j

A concatenação do SQL está errada, falta um espaço em branco antes do “values”

P

Olá, obrigado por responder. Acabei resolvendo sozinho. Simplesmente deletei todo o projeto e comecei do zero. Quando coloquei pra rodar o novo projeto, foi lançada uma exceção de driver não encontrado. então registrei usando o Class.forName() na fábrica de conexão e para minha surpresa funcionou. Valeu.

Criado 3 de outubro de 2012
Ultima resposta 5 de out. de 2012
Respostas 2
Participantes 2