Alguém sabe onde está meu erro?

21 respostas
Andre_Rosa

Classe Main:

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package controle;

import dao.ContatoDao;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;
import junior.banco.criaConexao;
import logica.Contato;

/**
 *
 * @author Andre
 */
public class Main {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) throws SQLException {
        // TODO code application logic here
     Contato contato = new Contato();

     contato.setId(Long.valueOf(3));
     contato.setNome("Tiao");
     contato.setRaca("Vira lata");
     contato.setSexo("Macho");
     contato.setVacinado("Nao");
     ContatoDao dao = new ContatoDao();
     dao.altera(contato);
    
    }

}

Classe ContatoDao:

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import junior.banco.criaConexao;
import logica.Contato;

/**
 *
 * @author Andre
 */
public class ContatoDao {

    private Connection conexao;

    public ContatoDao() throws SQLException{
        this.conexao = criaConexao.getConexao();

    }

    public void adiciona(Contato c1) throws SQLException{
        //Prepara conexao
        String sql = "insert into boi (nome, raca, sexo, vacinado)"+
                "values (?,?,?,?)";
        PreparedStatement stmt = conexao.prepareStatement(sql);

        //Seta os valores
        stmt.setString(1, c1.getNome());
        stmt.setString(2, c1.getRaca());
        stmt.setString(3, c1.getSexo());
        stmt.setString(4, c1.getVacinado());

        //Executa o código SQK
        stmt.execute();
        stmt.close();
    }

    public List<Contato> getLista() throws SQLException{
        String sql = "select * from boi";
        PreparedStatement stmt = this.conexao.prepareStatement(sql);
        ResultSet rs = stmt.executeQuery();

        List<Contato> minhaLista = new ArrayList<Contato>();

        while(rs.next()){
            Contato c1 = new Contato();
            c1.setNome(rs.getString("nome"));
            c1.setRaca(rs.getString("raca"));
            c1.setSexo(rs.getString("sexo"));
            c1.setVacinado(rs.getString("vacinado"));
            minhaLista.add(c1);
        }

        rs.close();
        stmt.close();
        return minhaLista;

        }

      public void altera(Contato c1) throws SQLException{
          String sql = "update boi set nome=?, raca=?"+
          "sexo=?, vacinado=? where id=?";
          PreparedStatement stmt = conexao.prepareStatement(sql);

        stmt.setString(1, c1.getNome());
        stmt.setString(2, c1.getRaca());
        stmt.setString(3, c1.getSexo());
        stmt.setString(4, c1.getVacinado());
        stmt.setLong(0, c1.getId());

        stmt.execute();
        stmt.close();

      }

    }

O erro é:

run: Conexao feita com sucesso! Exception in thread "main" java.sql.SQLException: Parameter index out of range (0 < 1 ). at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1055) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:926) at com.mysql.jdbc.PreparedStatement.checkBounds(PreparedStatement.java:3283) at com.mysql.jdbc.PreparedStatement.setInternal(PreparedStatement.java:3272) at com.mysql.jdbc.PreparedStatement.setInternal(PreparedStatement.java:3314) at com.mysql.jdbc.PreparedStatement.setLong(PreparedStatement.java:3330) at dao.ContatoDao.altera(ContatoDao.java:78) at controle.Main.main(Main.java:34) Java Result: 1 CONSTRUÍDO COM SUCESSO (tempo total: 1 segundo)

Informações:

Banco de dados: vacina
Tabela: boi

Se alguém puder ajudar, eu ficaria agradecido. Obrigado.

21 Respostas

pedroroxd

você quer realmente alterar, ou quer adicionar?

Andre_Rosa

Oi, eu quero alterar. Eu só não entendi o porque do erro, pois no NetBeans não há nenhuma linha em vermelho…

LPJava

o erro ta aqui:

stmt.setLong(0, c1.getId());

ti pergunto pq zero?

Andre_Rosa

LPJava:
o erro ta aqui:

stmt.setLong(0, c1.getId());

ti pergunto pq zero?

Alterei para 5:

stmt.setLong(5, c1.getId());

Porém o erro persiste…

Vocês sabem o que pode ser ?

Obrigado pelas respostas.

LPJava

o log do erro é o mesmo?

Andre_Rosa

Acho que sim…

<blockquote>run:

Conexao feita com sucesso!

Exception in thread main com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near sexo=Macho, vacinado=Nao where id=3 at line 1

at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)

at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)

at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)

at java.lang.reflect.Constructor.newInstance(Constructor.java:513)

at com.mysql.jdbc.Util.handleNewInstance(Util.java:406)

at com.mysql.jdbc.Util.getInstance(Util.java:381)

at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1030)

at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956)

at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3491)

at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3423)

at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1936)

at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2060)

at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2542)

at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1734)

at com.mysql.jdbc.PreparedStatement.execute(PreparedStatement.java:995)

at dao.ContatoDao.altera(ContatoDao.java:80)

at controle.Main.main(Main.java:34)

Java Result: 1</blockquote>

Obrigado pela resposta.

LPJava

o problema está na sua sintaxe do sql. eu ja passei por isso, para ter a sintaxe correta eu primeiro executava o que eu queria no sql prompt e depois pegava aquele code e jogava no meu code java, assim evitava estes erros, claro que nao era copy/paste, mas a logica da coisa.

Entao revise ai sua sintaxe sql, como o log está pedindo.

Andre_Rosa

LPJava:
o problema está na sua sintaxe do sql. eu ja passei por isso, para ter a sintaxe correta eu primeiro executava o que eu queria no sql prompt e depois pegava aquele code e jogava no meu code java, assim evitava estes erros, claro que nao era copy/paste, mas a logica da coisa.

Entao revise ai sua sintaxe sql, como o log está pedindo.

Pensei nisso mesmo, pois o NetBeans não deixava nenhuma linha vermelha…

Muito obrigado pelo auxilio.

LPJava

juniorlinux:
LPJava:
o problema está na sua sintaxe do sql. eu ja passei por isso, para ter a sintaxe correta eu primeiro executava o que eu queria no sql prompt e depois pegava aquele code e jogava no meu code java, assim evitava estes erros, claro que nao era copy/paste, mas a logica da coisa.

Entao revise ai sua sintaxe sql, como o log está pedindo.

Pensei nisso mesmo, pois o NetBeans não deixava nenhuma linha vermelha…

Muito obrigado pelo auxilio.

eh, nem sempre a ide ajuda ne? hehe. :D.

manolimars

faz um teste com:

stmt.executeUpdate();

ao invés de stmt.execute();
Andre_Rosa
manolimars:
faz um teste com:
stmt.executeUpdate();

ao invés de stmt.execute();

Amigo, a saída foi o erro:

run: Conexao feita com sucesso! Exception in thread "main" com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'sexo='Macho', vacinado='Nao' where id=3' at line 1 at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) at java.lang.reflect.Constructor.newInstance(Constructor.java:513) at com.mysql.jdbc.Util.handleNewInstance(Util.java:406) at com.mysql.jdbc.Util.getInstance(Util.java:381) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1030) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3491) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3423) at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1936) at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2060) at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2542) at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1734) at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2019) at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1937) at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1922) at dao.ContatoDao.altera(ContatoDao.java:80) at controle.Main.main(Main.java:34) Java Result: 1

Obrigado pela resposta.

Andre_Rosa

up

P

Ta faltando uma virgula e um espaco entre sexo e raça :slight_smile:
Seu sql ta ficando assim : “update boi set nome=?, raca=?sexo=?, vacinado=? where id=?”
deveria ficar assim: “update boi set nome=?, raca=?, sexo=?, vacinado=? where id=?”

Ok?

Andre_Rosa

plinioj:
Ta faltando uma virgula e um espaco entre sexo e raça :slight_smile:
Seu sql ta ficando assim : “update boi set nome=?, raca=?sexo=?, vacinado=? where id=?”
deveria ficar assim: “update boi set nome=?, raca=?, sexo=?, vacinado=? where id=?”

Ok?

Amigão! É verdade, eu havia me esquecido de uma vírgula :slight_smile:

Compilei, mas continuo com erro:

<blockquote>run:

Conexao feita com sucesso!

Exception in thread “main” java.sql.SQLException: Parameter index out of range (0 < 1 ).

at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1055)

at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956)

at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:926)

at com.mysql.jdbc.PreparedStatement.checkBounds(PreparedStatement.java:3283)

at com.mysql.jdbc.PreparedStatement.setInternal(PreparedStatement.java:3272)

at com.mysql.jdbc.PreparedStatement.setInternal(PreparedStatement.java:3314)

at com.mysql.jdbc.PreparedStatement.setLong(PreparedStatement.java:3330)

at dao.ContatoDao.altera(ContatoDao.java:77)

at controle.Main.main(Main.java:34)

Java Result: 1</blockquote>

Sabe o que pode ser ?

Muito obrigado pela resposta.

Thiago_Senna

Em primeiro lugar, experimente colocar toda string referente ao comando sql em apenas uma linha pra ficar mais fácil de você mesmo encontrar o erro.

obs: depois q vc corrigir, ai tu volta a quebrar as strings em varias linhas, mas com mais cuidado :wink:

Andre_Rosa

Thiago Senna:
Em primeiro lugar, experimente colocar toda string referente ao comando sql em apenas uma linha pra ficar mais fácil de você mesmo encontrar o erro.

obs: depois q vc corrigir, ai tu volta a quebrar as strings em varias linhas, mas com mais cuidado ;)

Comecei a fazer isso amigo, mas não encontro nada errado :frowning:

O erro é com o SQL mesmo…

Ta brabo :S

Obrigado pela resposta.

Thiago_Senna

copie o sql e execute direto no seu cliente de banco de dados para achar o erro. Depois copie-os de volta. Vc está provavelmente comandos que deveriam estar separados. Aparentemente nao tem erro no seu SQL, entao o jeito é testar direto no banco. Ou, deleta tudo e começa denovo :stuck_out_tongue:

Andre_Rosa

Prefiro a primeira opção : p

Vou fazer como dito por você, hoje eu nem durmo por causa desse programa, não quero ter que passar o domingo programando :frowning:

O pior é que a vaga de emprego depende desse programa :frowning:

Obrigado!

Thiago_Senna

a sugestão de deletar e fazer de novo as vezes parece absurda, mas funciona. É mais fácil recomeçar e fazer certo do que concertar, as vezes. Enfim, no pior dos casos, tente descansar um pouco, e depois volte a fazer.

R

e ai conseguiram resolver. vou tentar testar aqui. index out of range ???

algo esta fora dos valores corretos.

para fazer este banco da trabalho, tens o create table.

?
é só digitar show create table boi, é isto? boi ?

nao adianta saber a tabela, e o banco, muito sem isso.

ViniGodoy

Novamente reclamou de um parâmetro com índice 0. Os parâmetros do preparedstatement começam no índice 1.

O erro está na linha 77 da classe ContatoDao (é bom ler direitinho o erro da SQL, ele diz exatamente qual é o problema).

Criado 31 de julho de 2010
Ultima resposta 31 de jul. de 2010
Respostas 21
Participantes 8