Problema com metodo edição usando jdbc

19 respostas
V

Galera mais uma vez venho pedir ajuda a vcs criei um meto de ediçãocliente e infeliz não roda de jeito nenhum sempre q altero alguma
coisa ele dá um erro diferente agradeço se vcs me ajudarem.

acho que o problema esteja nesse executequery.

public Clientes editarCliente(String cpf) throws SQLException{
		
		con=conect.conectar();
		String sql="update cliente set nome=?, email=?, estado=?, cidade=?, bairro=?, rua=?, cep=?, numero=? where cpf=?";
		smt=con.prepareStatement(sql);
		Clientes c = new Clientes();
		
		smt.setString(1,cpf);
		rs=smt.executeQuery();
				
		while (rs.next()){
				
		    c.setNome(rs.getString("nome"));
			c.setCpf(rs.getString("cpf"));
			c.setEmail(rs.getString("email"));
			c.setEstado(rs.getString("estado"));
			c.setCidade(rs.getString("cidade"));
			c.setBairro(rs.getString("bairro"));
			c.setRua(rs.getString("rua"));
			c.setCep(rs.getString("cep"));
			c.setNumero(rs.getInt("numero"));
							
		}
		
		smt.execute();
		smt.close();
		con.close();
			
		return c;
	}

19 Respostas

wbdsjunior

o problema é:

você tem 9 parâmetros (pontos de interrogação) no seu PreparedStatment

String sql="update cliente set nome=?, email=?, estado=?, cidade=?, bairro=?, rua=?, cep=?, numero=? where cpf=?";

mas atribui apenas 1

smt.setString(1,cpf); rs=smt.executeQuery();
cadê os outros 8?

M

alem disso voce instanciou o objeto mas ficou por isso…

Clientes c = new Clientes();

smt.setString(1,[color=red]c.get[/color]Cpf);
kicolobo

Outro problema é que você está enviando uma ação de edição para o banco de dados e a tratando como uma consulta.

o método next só deve ser enviado para objetos ResultSet quando executamos uma consulta no BD, não quando estamos inserindo, editando ou excluindo registros.

wbdsjunior

magraum:
alem disso voce instanciou o objeto mas ficou por isso…

Clientes c = new Clientes();

smt.setString(1,[color=red]c.get[/color]Cpf);   </blockquote>

você está enganado.

o cpf foi recebido por parâmetro no método editarCliente(String cpf).

V

Pessoal eu alterei o método mas assim vêm dando pau não consigo entender em que por favor agradeço a colaboração de vcs...

public Clientes editarCliente(String cpf) throws SQLException{
		
		con=conect.conectar();
		String sql="update cliente set nome=?, cpf=?,  email=?, estado=?, cidade=?, bairro=?, rua=?, cep=?, numero=? where cpf=?";
		smt=con.prepareStatement(sql);
		Clientes c = new Clientes();
		
		smt.setString(10, cpf);
		rs=smt.executeQuery();
				
		while (rs.next()){
				
		    c.setNome(rs.getString("nome"));
			c.setCpf(rs.getString("cpf"));
			c.setEmail(rs.getString("email"));
			c.setEstado(rs.getString("estado"));
			c.setCidade(rs.getString("cidade"));
			c.setBairro(rs.getString("bairro"));
			c.setRua(rs.getString("rua"));
			c.setCep(rs.getString("cep"));
			c.setNumero(rs.getInt("numero"));
							
		}
		
		smt.setString(1,c.getNome());
		smt.setString(2,c.getCpf());
		smt.setString(3,c.getEmail());
		smt.setString(4,c.getEstado());
		smt.setString(5,c.getCidade());
		smt.setString(6,c.getBairro());
		smt.setString(7,c.getRua());
		smt.setString(8,c.getCep());
		smt.setInt(9,c.getNumero());
		
		
		smt.execute();
		smt.close();
		con.close();
			
		return c;
	}
kicolobo
Um dos problemas está aqui:
String sql="update cliente set nome=?, cpf=?,  email=?, estado=?, cidade=?, bairro=?, rua=?, cep=?, numero=? where cpf=?";  
        smt=con.prepareStatement(sql);  
        Clientes c = new Clientes();  
          
        smt.setString(10, cpf);  
        rs=smt.executeQuery();  
                  
        while (rs.next()){

Se você está tratando uma edição como uma consulta.

Não precisa deste ResultSet.

V

Retirei o resultset e agora ele me dá outros problemas referêntes segue os erros
apresentados no meu console na imagem abaixo.

esses são os erros que aparecem no console quando compilo o código…Após ter retirado o resultset

Exception in thread main org.postgresql.util.PSQLException: Nenhum valor especificado para o parâmetro 10

at org.postgresql.core.QueryExecutor.sendQueryV3(QueryExecutor.java:313)

at org.postgresql.core.QueryExecutor.executeV3(QueryExecutor.java:121)

at org.postgresql.core.QueryExecutor.execute(QueryExecutor.java:100)

at org.postgresql.core.QueryExecutor.execute(QueryExecutor.java:43)

at org.postgresql.jdbc1.AbstractJdbc1Statement.execute(AbstractJdbc1Statement.java:517)

at persistencia.Repositorio_Cliente.editarCliente(Repositorio_Cliente.java:111)

at teste.Testes.main(Testes.java:31)
getAdicted

kicolobo, por gentileza,

JDBC ou Hibernate?

V

jdbc

wbdsjunior

método para atualização do Cliente:

public void editarCliente(Cliente c) throws SQLException {
    con = conect.conectar();  
    String sql = "update cliente set nome = ?, cpf = ?, email = ?, estado = ?, cidade = ?, bairro = ?, rua = ?, cep = ?, numero = ? where cpf = ?";
    smt = con.prepareStatement(sql);
    smt.setString(1, c.getNome());
    smt.setInt(2, c.getCpf());
    smt.setString(3, c.getEmail());
    smt.setString(4, c.getEstado());
    smt.setString(5, c.getCidade());
    smt.setString(6, c.getBairro());
    smt.setString(7, c.getRua());
    smt.setString(8, c.getCep());
    smt.setInt(9, c.getCpf());
    smt.execute();
    smt.close();
    con.close();
}
Uso do método:
Cliente c = new Cliente();
c.setNome("Fulano");
...

ClasseQueAtualizaCliente cqac = new ClasseQueAtualizaCliente();

try {
    cqac.editarCliente(c);
} catch (SQLException e){
    e.printStackTrace();
}
não há retorno porque você já tem o Cliente atualizado antes de passar para o método que faz isso no banco de dados.

importe: não testei o código acima. então pode haver ero de sintaxe.

getAdicted

Desculpa atazanar, vinkello, por causa do lance do HQL e SQL?

V

Meu veih tá pau aqui alterei todinho e continua dando pau agora diz que to passando um valor nulo pra
o parametro nome.

public void editarCliente(String cpf) throws SQLException{
		
		con=conect.conectar();
		String sql="update cliente set nome=?, cpf=?,  email=?, estado=?, cidade=?, bairro=?, rua=?, cep=?, numero=? where cpf=?";
		smt=con.prepareStatement(sql);
		Clientes c = new Clientes();
		
		smt.setString(10, cpf);
		
		smt.setString(1,c.getNome());
		smt.setString(2,c.getCpf());
		smt.setString(3,c.getEmail());
		smt.setString(4,c.getEstado());
		smt.setString(5,c.getCidade());
		smt.setString(6,c.getBairro());
		smt.setString(7,c.getRua());
		smt.setString(8,c.getCep());
		smt.setInt(9,c.getNumero());
		
		
		smt.execute();
		smt.close();
		con.close();
	
	}
getAdicted

Eu quiz dizer qual possui desempenho, segurança, etc… Melhores, rs

[]'s

M

wbdsjunior:
magraum:
alem disso voce instanciou o objeto mas ficou por isso…

Clientes c = new Clientes();

smt.setString(1,[color=red]c.get[/color]Cpf);   </blockquote>

você está enganado.

o cpf foi recebido por parâmetro no método editarCliente(String cpf).

malz, agora fui ver :oops:

kicolobo

getAdicted:
kicolobo, por gentileza,

JDBC ou Hibernate?

JDBC

M

vinkello:
Meu veih tá pau aqui alterei todinho e continua dando pau agora diz que to passando um valor nulo pra

cola teu codigo onde voce ta setando os atributos ao objeto, o problema pode ser no teu objeto.setNome em outra classe

getAdicted

getAdicted wrote:
kicolobo, por gentileza,

JDBC ou Hibernate?

JDBC

Desculpa encher o saco, cara!

Por que? Sempre gostei do hibernate, mas dependendo da situação vou voltar a utilizar o JDBC. :smiley:

Obrigado pela atenção!

[]'s

neno

Muda o parametro do seu metodo manolo, ta dando nulo porque vc esta instanciando a classe cliente sem nada...

public void editarCliente(Cliente c) throws SQLException{ //muda pra ficar assim 
          
        con=conect.conectar();  
        String sql="update cliente set nome=?, cpf=?,  email=?, estado=?, cidade=?, bairro=?, rua=?, cep=?, numero=? where cpf=?";  
        smt=con.prepareStatement(sql);  
       // Clientes c = new Clientes();  //tira essa linha
          
        smt.setString(10, cpf);  
          
        smt.setString(1,c.getNome());  
        smt.setString(2,c.getCpf());  
        smt.setString(3,c.getEmail());  
        smt.setString(4,c.getEstado());  
        smt.setString(5,c.getCidade());  
        smt.setString(6,c.getBairro());  
        smt.setString(7,c.getRua());  
        smt.setString(8,c.getCep());  
        smt.setInt(9,c.getNumero());  
          
          
        smt.execute();  
        smt.close();  
        con.close();  
      
    }

so não esquece de quando for chamar o medodo editar, passar o objeto c de Cliente com os atributos nome, cpf etc preenchidos!

V

Pow vlw neno consegui resolver o problema de boa msm abração… Até mais dúvidas galera…flw…

Criado 12 de novembro de 2010
Ultima resposta 12 de nov. de 2010
Respostas 19
Participantes 6