Problema com metodo edição usando jdbc

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.

[code]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;
}[/code]

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?

alem disso voce instanciou o objeto mas ficou por isso…

Clientes c = new Clientes();

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

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.

[quote=magraum]alem disso voce instanciou o objeto mas ficou por isso…

Clientes c = new Clientes();

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

você está enganado.

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

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…

[code]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;
}[/code]

Um dos problemas está aqui:

[code]
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()){  
              [/code]

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

Não precisa deste ResultSet.

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)

kicolobo, por gentileza,

JDBC ou Hibernate?

jdbc

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:

[code]
Cliente c = new Cliente();
c.setNome(“Fulano”);

ClasseQueAtualizaCliente cqac = new ClasseQueAtualizaCliente();

try {
cqac.editarCliente©;
} catch (SQLException e){
e.printStackTrace();
}[/code]
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.

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

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

[code]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();

}[/code]

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

[]'s

[quote=wbdsjunior][quote=magraum]alem disso voce instanciou o objeto mas ficou por isso…

Clientes c = new Clientes();
smt.setString(1,[color=red]c.get[/color]Cpf); [/quote]
você está enganado.

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

malz, agora fui ver :oops:

[quote=getAdicted]kicolobo, por gentileza,

JDBC ou Hibernate?[/quote]

JDBC

[quote=vinkello]Meu veih tá pau aqui alterei todinho e continua dando pau agora diz que to passando um valor nulo pra
[/quote]

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

[quote]getAdicted wrote:
kicolobo, por gentileza,

JDBC ou Hibernate?

JDBC[/quote]

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

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

[code]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();  
  
}  [/code]

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

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