[RESOLVIDO] Problemas com cadastro feito em tempo de execução...( TableModel )

E ai galerinha… to com uma probleminha aqui é o seguinte.: Sempre que cadastro um novo contato ele aparece na JTable em tempo de execução perfeitamente, todos os dados aparecem perfeitamente, mas o ID referente a esse novo contato sempre vem com o valor “0”, ai quando fecho e abro a aplicação o ID referente ao novo contato aparece…será por que que ele só aparece qundo fecho e abro novamente a aplicação??? Por que ele nao aparece com o valor correto como os outros dados???
Vo postar os códigos referentes a parte de cadastro!!! Obrigado!!! :slight_smile:
INSERIR DO DAO

[code]public void inserir(Contato contato) throws SQLException{

	// Abrir uma conexao
	Connection conn = Conexao.getConexao();

	// Variável utilizada para armazenar os comandos SQL
	String sql = "insert into usuario(nome,idade,telefone)" + "values(?,?,?)";
	//Cria o Statement para executar o código SQL
	PreparedStatement stmt = conn.prepareStatement(sql);

	// Setar os valores no statemant
	stmt.setString(1, contato.getNome());
	stmt.setString(2, contato.getIdade());
	stmt.setString(3, contato.getTelefone());

	// Executa o código SQL com os valores setados
	stmt.execute();
	stmt.close();
}[/code]

REGRA DE NEGOCIO

[code]public void cadastrarContato(String nome , String idade , String telefone) throws SQLException{

	Contato cont = new Contato(nome,idade,telefone);
	contatoDAO cDAO = new contatoDAO();
	cDAO.inserir(cont);
}[/code]

BOTAO CADASTRAR

[code] private void bt_cadastrarActionPerformed(java.awt.event.ActionEvent evt) {

    if((evt.getSource() == bt_cadastrar) && (verificarDados())){
        ContatoNegocio cont = new ContatoNegocio();
        ContatoTableModel modelo = (ContatoTableModel)tabela.getModel();
        
        // Contato Criado para utilizar no tablemodel, para que ele
        // possa indentificar o novo contato
        Contato contato = new Contato(tf_nome.getText() , tf_idade.getText() , tf_telefone.getText());
        try {
            
            cont.cadastrarContato(contato.getNome(),contato.getIdade(),contato.getTelefone());
            modelo.add(contato);
            
        } catch (SQLException ex) {
            Logger.getLogger(ContatoFrame.class.getName()).log(Level.SEVERE, null, ex);
        }
        JOptionPane.showMessageDialog(null,"Cadastrado Com Sucesso!!!");
        limparCampos();
            
        
    }
} [/code]

Cara… é exatamente o motivo que eu falei da outra vez.

Depois de incluir no banco voce precisa pesquisar no banco qual é o id que o Contato foi inserido.

Depois setar o valor no Contato para que ele tenha seu valor atualizado.

Certo…Mas como sou iniciante,não sei como faz isso na prática,isso que ta me atrapalhando a resolver o problema!!! :frowning:

Boa noite.

Simples, após inserir o contato, voce tem que pesquisar com um “Select” qual foi o contato que foi inserido, portando logo após executar um insert, chame uma pesquisa informando o nome do contato inserido.

public void cadastrarContato(String nome , String idade , String telefone) throws SQLException{   
                 
        Contato cont = new Contato(nome,idade,telefone);   
        contatoDAO cDAO = new contatoDAO();   
        cDAO.inserir(cont);
        cDAO.pesquisar(cont);  // Aqui voce faz a pesquisa logo após o inserir.
}

Isto é, presumindo que o seu contatoDAO tenha um método pesquisar, passando como parâmetros o Contato.

Opa, blz cara…olha só…eu fiz um pouco diferente, mas utilizando sua lógica. criei um outro método dentro do DAo que pesquisava pelo nome inserido, e chamei dentro do metodo inserir do DAO, mas continua vindo com valor igual a zero…vo postar pra voc~e olhar os dois métodos!! Obrigado!!!

[code]public void inserir(Contato contato) throws SQLException{

	// Abrir uma conexao
	Connection conn = Conexao.getConexao();


	// Variável utilizada para armazenar os comandos SQL
	String sql = "insert into usuario(nome,idade,telefone)" + "values(?,?,?)";
            
	//Cria o Statement para executar o código SQL
	PreparedStatement stmt = conn.prepareStatement(sql);
            


	// Setar os valores no statemant
	stmt.setString(1, contato.getNome());
	stmt.setString(2, contato.getIdade());
	stmt.setString(3, contato.getTelefone());
           
           
            

	// Executa o código SQL com os valores setados
            stmt.execute();
            String nome = contato.getNome();
            int x =  pesquisarID(nome); // CHAMADA DO MÉTODO
            contato.setIdusuario(x);
            stmt.close();


}

    // ESSE MÉTODO IRÁ SER CHAMADO DENTRO DO MÉTODO INSERIR
    private int pesquisarID(String nome) throws SQLException{

        Connection conn = Conexao.getConexao();
        int x = 0;
        Contato contato = new Contato(nome);

        String sql = "Select idusuario from usuario where nome=?";
        PreparedStatement stmt = conn.prepareStatement(sql);
        stmt.setString(1,contato.getNome());
        ResultSet rs = stmt.executeQuery();

        if(rs.next() == true){
            contato.setIdusuario(rs.getInt("idusuario"));

             x = contato.getIdusuario();
        }
        return x;
    }

[/code]
Mesmo assim quando Cadastro, o Id continua vindo com o valor Zero :oops:

E ai galera alguma solução???

Agora que voce fez algo eu te ajudo.

public void inserir(Contato contato) throws SQLException{

		// Abrir uma conexao
		Connection conn = Conexao.getConexao();


		// Variável utilizada para armazenar os comandos SQL
		String sql = "insert into usuario(nome,idade,telefone)" + "values(?,?,?)";
                
		//Cria o Statement para executar o código SQL
		PreparedStatement stmt = conn.prepareStatement(sql);
                


		// Setar os valores no statemant
		stmt.setString(1, contato.getNome());
		stmt.setString(2, contato.getIdade());
		stmt.setString(3, contato.getTelefone());
               
               
                

		// Executa o código SQL com os valores setados
                stmt.execute();
                String nome = contato.getNome();
                int x =  pesquisarID(nome); // CHAMADA DO MÉTODO
                contato.setIdusuario(x);
                stmt.close();


	}

        // ESSE MÉTODO IRÁ SER CHAMADO DENTRO DO MÉTODO INSERIR
        private int pesquisarID(String nome) throws SQLException{

            Connection conn = Conexao.getConexao();
            String sql = "Select idusuario from usuario where nome=?";
            PreparedStatement stmt = conn.prepareStatement(sql);
            stmt.setString(1,nome);
            ResultSet rs = stmt.executeQuery();

            if(rs.next() == true)
                return rs.getInt("idusuario");
            else
               return -1;
        }

Verifique agora se ele retorna -1 ou 0.
Se for -1 voce deve usar um where melhor para retornar o valor certo.
Tente também colocar essa query no prompt do seu banco para ver se funciona.

Oi,

Na tabela USUARIO existe uma coluna exatamente com o nome idusuario ?
Depois do insert você deu commit ?

// ESSE MÉTODO IRÁ SER CHAMADO DENTRO DO MÉTODO INSERIR
        private int pesquisarID(String nome) throws SQLException{

            Connection conn = Conexao.getConexao();
            String sql = "Select idusuario from usuario where nome=?";
            PreparedStatement stmt = conn.prepareStatement(sql);            
            ResultSet rs = stmt.executeQuery();

            return (rs.next() ? rs.getInt("idusuario") : -1);
        }

Tchauzin!

Ai Mark_Ameba, testei seu exemplo na aplicação e o idusuario continua vindo para a JTable com o valor Zero “0”… o exemplo da lina tbm nao deu certo!!!
será que não é na TableModel não??? :frowning:
eu chamei o método pesquisar numa classe teste que apresentava valores em linha de texto, e retorno o idusuario certinha quando existia o nome dele no Banco, mas na JTable continua vindo com o valor zero :cry:

[quote=lina]Oi,

Na tabela USUARIO existe uma coluna exatamente com o nome idusuario ?
Depois do insert você deu commit ?

// ESSE MÉTODO IRÁ SER CHAMADO DENTRO DO MÉTODO INSERIR
        private int pesquisarID(String nome) throws SQLException{

            Connection conn = Conexao.getConexao();
            String sql = "Select idusuario from usuario where nome=?";
            PreparedStatement stmt = conn.prepareStatement(sql);            
            ResultSet rs = stmt.executeQuery();

            return (rs.next() ? rs.getInt("idusuario") : -1);
        }

Tchauzin![/quote]
Oi lina, eu nao conheço esse comando Commit, por isso nao usei :smiley:

Oi,

No seu caso… depois de executar o insert na base de dados, utilize:

Connection conn = Conexao.getConexao(); conn.commit();

Isso irá gravar as alterações na base…

Tchauzin!

Para JDBC nao precisa do commit.

Mas está com 0? incrivel deveria pelo menos estar com -1.

Coloca seu código onde voce faz a consulta para todos os objetos.

Eu não entendi muito bem qual código você quer por isso vo postar toda a classe DAO… Obrigado!

[code]package Banco;

import Apresentacao.ContatoTableModel;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
import Negocio.Contato;

public class contatoDAO {

public void inserir(Contato contato) throws SQLException{

	// Abrir uma conexao
	Connection conn = Conexao.getConexao();


	// Variável utilizada para armazenar os comandos SQL
	String sql = "insert into usuario(nome,idade,telefone)" + "values(?,?,?)";
            
	//Cria o Statement para executar o código SQL
	PreparedStatement stmt = conn.prepareStatement(sql);
            


	// Setar os valores no statemant
	stmt.setString(1, contato.getNome());
	stmt.setString(2, contato.getIdade());
	stmt.setString(3, contato.getTelefone());
           
           
            

	// Executa o código SQL com os valores setados
            stmt.execute();
            String nome = contato.getNome();
            int x =  pesquisarID(nome);
            contato.setIdusuario(x);
            stmt.close();


}

    private int pesquisarID(String nome) throws SQLException{

        Connection conn = Conexao.getConexao();
        int x = 0;
        //Contato contato = new Contato(nome);

        String sql = "Select idusuario from usuario where nome=?";
        PreparedStatement stmt = conn.prepareStatement(sql);
        stmt.setString(1,nome);
        ResultSet rs = stmt.executeQuery();

        if(rs.next() == true){
            return rs.getInt("idusuario");
        }else{
            return -1;
        }
        
    }

            
              
public List<Contato> listar() throws SQLException{ // MÉTODO UTILIZADO PARA BUSCAR OS DADOS DO BANCO E LISTAR DO JTABLE

    Connection conn = Conexao.getConexao();

	String sql = "Select * from usuario order by nome";
	PreparedStatement stmt = conn.prepareStatement(sql);

	// Esse método é utilizado para apontar para os dados do BD
	ResultSet rs = stmt.executeQuery();

	//Cria uma lsita para armazenar os valores que serão buscados
	 List<Contato> minhaLista = new ArrayList<Contato>();

	while(rs.next()){
		// Essa Rotína pega os dados do banco e armazena nesse objeto do tipo contato
		Contato contato = new Contato(rs.getInt("idusuario"));
                    contato.setNome(rs.getString("nome"));
                    contato.setIdade(rs.getString("idade"));
                    contato.setTelefone(rs.getString("telefone"));
                    
		//Essa rotína adiciona os dados de contato no objeto minhaLista
		minhaLista.add(contato);

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

public void altera(Contato contato) throws SQLException{

	Connection conn = Conexao.getConexao();
	String sql = " Update usuario set nome = ? ,idade = ? ,telefone = ? where idusuario = ? ";
	PreparedStatement stmt = conn.prepareStatement(sql);

	// Setar os valores no statemant
	stmt.setString(1, contato.getNome());
	stmt.setString(2, contato.getIdade());
	stmt.setString(3, contato.getTelefone());
	stmt.setInt(4,contato.getIdusuario());

	// Executa o código SQL com os valores setados
	stmt.execute();
	stmt.close();

}

public void deletar(Contato contato) throws SQLException{

	Connection conn = Conexao.getConexao();
	String sql= "Delete From usuario where idusuario=?";
	PreparedStatement stmt = conn.prepareStatement(sql);

	stmt.setInt(1, contato.getIdusuario());
	stmt.execute();
	stmt.close();

	}
public List<Contato> buscar(String nome) throws SQLException{

    Connection conn = Conexao.getConexao();

    // Nesta Rotína, nescessita de utilizar o contrutor
    // para inicializa-lo com o parametro de deseja consultar
        Contato contato = new Contato(nome);

            String sql = "Select * from usuario where nome=?";
	PreparedStatement stmt = conn.prepareStatement(sql);
	stmt.setString(1, contato.getNome());
	ResultSet rs = stmt.executeQuery();

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

	while(rs.next()){


		Contato cont = new Contato(rs.getInt("idusuario"));
                    cont.setNome(rs.getString("nome"));
                    cont.setIdade(rs.getString("idade"));
                    cont.setTelefone(rs.getString("telefone"));
		listar.add(cont);

	 }
	 rs.close();
	 stmt.close();
	 return listar;
  }

}

[/code]

[u][quote=lina]Oi,

No seu caso… depois de executar o insert na base de dados, utilize:

Connection conn = Conexao.getConexao(); conn.commit();

Isso irá gravar as alterações na base…

Tchauzin![/quote]
O commiit não funcionou

Hm… tente o seguinte.

public void inserir(Contato contato) throws SQLException{

		// Abrir uma conexao
		Connection conn = Conexao.getConexao();


		// Variável utilizada para armazenar os comandos SQL
		String sql = "insert into usuario(nome,idade,telefone)" + "values(?,?,?)";
                
		//Cria o Statement para executar o código SQL
		PreparedStatement stmt = conn.prepareStatement(sql);
                


		// Setar os valores no statemant
		stmt.setString(1, contato.getNome());
		stmt.setString(2, contato.getIdade());
		stmt.setString(3, contato.getTelefone());
               
               
                

		// Executa o código SQL com os valores setados
                stmt.execute();
                stmt.close();
                 String sql = "Select max(idusuario) as id from usuario";
            PreparedStatement stmt = conn.prepareStatement(sql);
            ResultSet rs = stmt.executeQuery();
            contato.setIdusuario(rs.getInt("id"));
                stmt.close();
	}

Testei sua nova solução e o ID continua vindo com o valor zero :frowning:

Po… abre o banco de dados por um cmd e ve os dados então. Impossivel isso.

Oi,

Sugiro que abra pelo sqlplus ou DBedit e faça o insert e select tudo na unha mesmo…

Confira os resultados.

Pode ter certeza de uma coisa, algo de errado não esta certo. :stuck_out_tongue:

Tchauzin!

eu ja fiz isso, ja puchei is dados em uma janela de comandos, e tudo certo, mas na JTable sempre vem como valor zero :cry:

pois é lina, ja fiz isso…