To fazendo o ATUALIZAR no bd… o meu eh amis facil, pois s´´o tem 2 parametros,que é a referencia e o nome.
meu metodo NO Controle é:
public String AtualizarProduto(String referencia,String nome, ProdutoBin ProBin){
conexao bd = new conexao();
String retorno = "erro";
int res;
try{
Connection ExConn = bd.abrirBDConn();
Statement stmt = ExConn.createStatement();
res = stmt.executeUpdate("UPDATE mappingbabybd.bolsa SET ref = '"+referencia+"', nome = '"+nome+"' WHERE ref = " + ProBin.getReferencia()+"'");
if(res==1) JOptionPane.showMessageDialog(null, "O produto foi atualizado com sucesso.");
stmt.close();
bd.fecharBDConn();
}catch(Exception e){
JOptionPane.showMessageDialog(null, "O produto não foi atualizado.");
}return retorno;
}
e no botao é:
[code]
JButton btnAtualizar = new JButton("Salvar");
btnAtualizar.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
ProBin.setReferencia(ref_text.getText());
ProBin.setNome(nome_text.getText());
BancoControl.AtualizarProduto(ref_text.getText(), nome_text.getText(), ProBin);
}
});
[/code]
pela logica está tudo certo, ao clicar no botao salvar ele pega os valores dos campos ref_text e ref_nome e joga no ProBin.
Ai chama o metodo do controle AtualizarProduto que manda como parametro os valores dentro dos campos ref_text e ref_nome e o ProBin.
no metodo ele da um update, setando os valores novos.
Na logica esta correto né?
mas quando clico no atualizar, ele ja parte pra msg ( O produto não foi atualizado.)
Tem alguma sugestao?
Eu coloquei um System.out.println(res); antes do if, e o comando sql ta retornando 0, por isso qeu ele nao esta dando o UPDATE.
acho que tem algum erro na string do UPDATE. mas n consigo achar qual. Eu tb ja testei pra saber se tem algum valor no ProBin, e os valores estao nele. só falta atualizar certo. estou errado em algum ponto da string?
Cara ta faltando uma ’ depois do where
Está assim:
WHERE ref = " + ProBin.getReferencia()+"'");
Deveria estar assim:
WHERE ref = ' "+ProBin.getReferencia()+" ' ");
Uma boa dica é quando você trabalhar com try/catch no catch sempre imprimir no console o stacktrace da exception facilita muito o debug, um exemplo:
catch(Exception e){
JOptionPane.showMessageDialog(null, "O produto não foi atualizado.");
e.printStackTrace();//isso imprime as exceções
}
Outra boa recomendação é utilizar o PreparedStatement para que você não tenha que ficar concatenando strings e ele evita SQL Injection.
Outra coisa pq na passagem de parâmetros para o método “AtualizarProduto” você não passa somente a classe “ProBin”, elimina a redundância de parâmetros, deixa o código mas legível e facilita uma manutenção futura.
Olá, fiz o q mandaste, deixei igualzinho
[code]public String AtualizarProduto(ProdutoBin ProBin){
conexao bd = new conexao();
String retorno = “erro”;
int res;
try{
Connection ExConn = bd.abrirBDConn();
Statement stmt = ExConn.createStatement();
res = stmt.executeUpdate("update mappingbabybd.bolsa set ref = '"+ProBin.getReferencia()+"', nome = '"+ProBin.getNome()+"' WHERE ref = ' "+ProBin.getReferencia()+" ' ");
// System.out.println(ProBin.getReferencia());
System.out.println(res);
if(res==1) {JOptionPane.showMessageDialog(null, "O produto foi atualizado com sucesso.");
stmt.close();
bd.fecharBDConn();}
}catch(Exception e){
JOptionPane.showMessageDialog(null, "O produto não foi atualizado.");
e.printStackTrace();
}return retorno;
}[/code]
Passei ate o ProBin somente ocmo parametro.
mas a variavel res ainda ta retornando 0.
Continua sendo algum erro na string update?
Eu tb tentei usar com preparedstatement como você me instruiu, mas continua sem atualizar.
[code]public String AtualizarProduto(ProdutoBin ProBin){
conexao bd = new conexao();
String retorno = "erro";
PreparedStatement stmt = null;
int res;
try{
Connection ExConn = bd.abrirBDConn();
stmt = ExConn.prepareStatement("update mappingbabybd.bolsa set ref = ?, nome = ? where ref = '"+ProBin.getReferencia()+"'");
stmt.setString(1, ProBin.getReferencia());
stmt.setString(2, ProBin.getNome());
int result = stmt.executeUpdate();
if(result>0) {JOptionPane.showMessageDialog(null, "O produto foi atualizado com sucesso.");
stmt.close();
bd.fecharBDConn();}
}catch(Exception e){
JOptionPane.showMessageDialog(null, "O produto não foi atualizado.");
e.printStackTrace();
}return retorno;
}
}[/code]
Descobri o problema.
O problema eh que quando eu clico na linha do jtable, os campos text field capturam a ref e o nome da linha da tabela.
ai eu mudo a ref e o nome, e quando clico em atualizar ele diz que NAO EXISTE a referencia nova que editei.
ou seja: nao estou conseguindo alterar a referencia que eu coloquei nova pela referencia que tem no banco.
ex: eu clico la na linha do jtable e os valores aparecem nos text fiel REF: AAA NOME: BBBB, ai eu edito a referencia para CCCC. ai ele diz que a referencia CCCC nao existe no meu BD. mas se eu deixar AAA e so trocar o nome, ele altera normal. como faço pra trocar as referencias?
Isso está parecendo erro na operação sql que voce esta fazendo.
O erro esta na condição do seu where.
tem um id na sua tabela? se tiver usa ele para colocar como condição no where.
porque a referencia que voce está tentando atualizar ela não existe ainda no seu banco.
por exemplo:
"update mappingbabybd.bolsa set ref = ?, nome = ? where id_produto = ?"); //caso o id da sua tabela tenha esse nome
stmt.setString(1, ProBin.getReferencia());
stmt.setString(2, ProBin.getNome());
stmt.setInt(3,ProBin.getId());// no caso do id do seu banco ser um inteiro. caso voce não tenha um atributo id na sua classe crie um