Alguem me ajude!

Pessoal é o seguinte. fiz uma agenda em swing, ta tudo funcionando blz, menos quando quero atualizar um telefone/email.Quando quero atualizar, cliko no botao atualizar telefone na minha JFrame principal que abre outra Jframe onde me retorna do banco os telefones, que são visualizados em JTextFields. Até aí tudo bem!!! O problema é que quando cliko em ok para atualizar e fecho o JFrame principal os dados nao são salvos no BD, mas se eu cliko em ok e depois vou mexer em alguma coisa no programa tipo “buscar contato”, os dados são salvos.

Ás vezes dá um erro dizendo q houve falha na conexão.

Alguem pode me ajudar???

To usando BO,TO,DAO.

HSQLDB

Vou mandar alguns métodos pra ajudar a compreender:

Estes métodos estão no Frame AtualizarEndereço(recebo como paramentro o resultset da busca pelo contato e outro resultset da busca pelo endereço) que além de atualizar o endereço tb atualiza o contato(nome e nascimento):

private void initialize() {
this.setSize(300, 220);
this.setContentPane(getJContentPane());
this.setTitle(“Atualizar Endereço”);

	try {
		while (rs.next()) {
			nome = rs.getString("nome");
			jtNome.setText(nome);
			SimpleDateFormat dtfGeral = new SimpleDateFormat("dd/MM/yyyy");

			String geral = dtfGeral.format(java.sql.Date.valueOf(rs
					.getString("nasc")));

			jtNascimento.setText(geral);
		}
		while (rs1.next()) {
			jtLogradouro.setText(rs1.getString("logradouro"));
			jtNumero.setText(rs1.getString("numero"));
			jtBairro.setText(rs1.getString("bairro"));
			jtCep.setText(rs1.getString("cep"));
			jtComplemento.setText(rs1.getString("complemento"));
		}
	} catch (SQLException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
}

Este método retorna a ação do botão:
private JButton getJButton() {
if (jButton == null) {
jButton = new JButton();
jButton.setBounds(new Rectangle(108, 160, 55, 21));
jButton.setText(“OK”);
jButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
AgendaBO agenda = new AgendaBO();
Date data;
c = agenda.buscarContato(nome);
try {
data = Contato.parseDateSQL(jtNascimento.getText());
c.setNasc(data);
c.setNome(jtNome.getText());
} catch (Exception e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}

				em = agenda.buscarEndereco(c.getId());
				em.setBairro(jtBairro.getText());
				em.setCep(jtCep.getText());
				em.setLogradouro(jtLogradouro.getText());
				em.setComplemento(jtComplemento.getText());
				int num = Integer.parseInt(jtNumero.getText());
				em.setNumero(num);
				System.out.println(c.getNome());
				System.out.println(c.getId());
				agenda.atualizar(c, em);
				JOptionPane.showMessageDialog(null,
						"Cadastro Atualizado com Sucesso!");

			}
		});

	}
	return jButton;
}

Este método é a ação do botao que está no Frame agenda(principal):
private JButton getJAtEndereco() {
if (jAtEndereco == null) {
jAtEndereco = new JButton();
jAtEndereco.setBounds(new Rectangle(102, 69, 151, 35));
jAtEndereco.setFont(new Font(“Dialog”, Font.BOLD, 10));
jAtEndereco.setText(“Alterar Nome/Endereço”);
jAtEndereco.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
AgendaBO agenda = new AgendaBO();
if (agenda.buscarContato(jtNome.getText()).getNome() == null)
JOptionPane.showMessageDialog(null,
“Cadastro inexistente!”);
else {
c = agenda.buscarContato(jtNome.getText());
new AtualizarEndereco(agenda.listarContatosPorId(c
.getId()), agenda.listarEnderecos(c.getId()));

				}
				
			}
		});
	}
	return jAtEndereco;
}

Este método está na AgendaBO:
public void atualizar(Contato c,Endereco en) {

	try {
		ContatoDAO contato = new ContatoDAO();
		EnderecoDAO endereco = new EnderecoDAO();
		contato.atualizar(c);
		endereco.atualizar(en);

	} catch (SQLException s) {
		System.out.println('\n' + "Erro na conexão com o banco");
	}

}

Estes métodos estão no ContatoDAO:
public Contato buscar(String nome) {
Contato c= new Contato();

	try {
        c.setNasc(Contato.parseDateSQL("00/00/0000"));
		Statement stmt = this.conexao.createStatement();
		String query = "SELECT ID,NOME,NASC FROM CONTATO WHERE nome=" + "'" + nome
				+ "'";
		res = stmt.executeQuery(query);
		while (res.next()) {
			c.setId(res.getInt("id"));
			c.setNome(res.getString("nome"));
			c.setNasc(res.getDate("nasc"));
			}
		stmt.close();
	} catch (SQLException e) {
		System.out.println("Erro duranta a pesquisa:" + e.getMessage());
	} catch (Exception e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}

	return c;

}

public boolean atualizar(Contato c) {
boolean testa = false;

	try {
		Statement stmt = this.conexao.createStatement();
		String query = "UPDATE CONTATO SET NOME= '" + c.getNome()
		+ "' WHERE ID=" + c.getId() + ";"
				+ "UPDATE CONTATO SET NASC= '" + c.getNasc() + "' WHERE ID="
				+ c.getId();
		res = stmt.executeQuery(query);
		stmt.close();
		testa = true;
	} catch (SQLException e) {
		System.out.println("Erro duranta a inserção:" + e.getMessage());
	}

	return testa;
}

}

E está classe é a que faz a conexão:
package br.com.ffm.agenda.conexao;

import java.sql.*;

/**

  • @author Marciano Gonçalves

*/
public class ConexaoHSQLDB {

private static ConexaoHSQLDB conexao = null;

private Connection conn;


/**
 * 
 */
public ConexaoHSQLDB() {
	try {
		Class.forName("org.hsqldb.jdbcDriver");
		conn = DriverManager
				.getConnection("jdbc:hsqldb:file:bd/bancoAgenda");
	} catch (SQLException e) {
		System.out.println('\n' + "Erro na conexão com o banco");
		e.printStackTrace();
		System.exit(1);
	} catch (ClassNotFoundException e) {
		System.out
				.println('\n' + "Classe do driver do banco de dados não encontrada");
	}
}

/**
 * @return
 */
public static Connection getConnection() {
	if (conexao == null) {
		conexao = new ConexaoHSQLDB();
	}
	return conexao.conn;
}

/**
 * 
 */
public void close() {
	try {
		conn.createStatement().execute("shutdown");
		conn.close();
	} catch (SQLException ex) {
		ex.printStackTrace();
	}
}

}

Mudei, mas continua com o mesmo problema!!

que banco esta usando?

Olhando o seu codigo ele esta certo. Só tem uma coisa que não está muito legal, mas como não entendo muito como funciona internamente o driver que esta usando não sei dizer se é isso. No metodo que voce usa para atualizar, voce está usando executequery(string sql), que geralmente é utilizado quando voce quer obter algum dado e não para alterar informações, pode ser que isso impacte de alguma forma, altere o seu codigo utilize o metodo execute(string sql) ou executeUpdate(string sql). Segue abaixo em negrito a linha que eu to falando

public boolean atualizar(Contato c) {
boolean testa = false;

try {
Statement stmt = this.conexao.createStatement();
String query = “UPDATE CONTATO SET NOME= '” + c.getNome()

  • “’ WHERE ID=” + c.getId() + “;”
  • “UPDATE CONTATO SET NASC= '” + c.getNasc() + “’ WHERE ID=”
  • c.getId();
    res = stmt.executeQuery(query);
    stmt.close();
    testa = true;
    } catch (SQLException e) {
    System.out.println(“Erro duranta a inserção:” + e.getMessage());
    }

return testa;
}

}

Altere nos dois metodos de update

flw

Paulo