Como retornar dados do banco?

13 respostas
Willdoidao

Tenho uma aplicação e quero fazer o seguinte ela vai no banco faz um select com order by e pega o ultimo id, soma +1 desse numero e retorna para um jtextfield, fiz o código abaixo mas não esta funcionando nem dando erro alguem poderia me ajudar?!?!?
Segue o código:

public void carregaCodigoOs() {

        Connection conn = new coneccao().conectar();
        ResultSet rs = null;
        try {
            // Cria e executa uma instru��o SQL
            MeuState = conn.createStatement();
        } catch (SQLException ex) {
            ex.printStackTrace();
            JOptionPane.showMessageDialog(null, "erro de STATEMENT");
        }
        try {
            rs = MeuState.executeQuery("");
            while (rs.next()) {
                rs.last();
                int Cod = rs.getInt("idOrdem");
                Cod = Cod + 1;
                String CodS = String.valueOf(Cod);
                Num_os.setText(CodS);
                System.out.print(Cod);
                System.out.print(CodS);
            }

        } catch (SQLException ex) {
            JOptionPane.showMessageDialog(null, "Problema de conexao: " + ex.getMessage());
        }
    }

13 Respostas

Carlos_ds_jar
rs = MeuState.executeQuery("");

Onde está a consulta?

lina

Oi,

A primeira pergunta.: Qual é o erro apresentado?

Tchauzin!

Carlos_ds_jar

lina:
Oi,

A primeira pergunta.: Qual é o erro apresentado?

Tchauzin!

Ei lina não sei se vc percebeu quando ele disse:

Tenho uma aplicação e quero fazer o seguinte ela vai no banco faz um select com order by e pega o ultimo id, soma +1 desse numero e retorna para um jtextfield, fiz o código abaixo mas não esta funcionando nem dando ERRO ALGUM poderia me ajudar?!?!?
Segue o código:

lina

Oi,

Ele não disse “erro algum” e sim “erro alguem”.
Obs.: Por favor, verifique a sua caixa de mensagens (MP)

Bom, analisando o código o motivo realmente é que não está passando a query. Logo, não entra no while.:

rs = MeuState.executeQuery("<colocar o comando ou query a ser executada>"); while (rs.next()) {

Tchauzin!

Willdoidao

Ops! Foi mal tava tão nervoso em nw descobri o erro que copiei errado

public void carregaCodigoOs() {

        Connection conn = new coneccao().conectar();
        ResultSet rs = null;
        try {
            // Cria e executa uma instru��o SQL
            MeuState = conn.createStatement();
        } catch (SQLException ex) {
            ex.printStackTrace();
            JOptionPane.showMessageDialog(null, "erro de STATEMENT");
        }
        try {
            rs = MeuState.executeQuery("select idOrdem from ordemserv order by idOrdem");
            while (rs.next()) {
                rs.last();
                int Cod = rs.getInt("idOrdem");
                Cod = Cod + 1;
                String CodS = String.valueOf(Cod);
                Num_os.setText(CodS);
                System.out.print(Cod);
                System.out.print(CodS);
            }

        } catch (SQLException ex) {
            JOptionPane.showMessageDialog(null, "Problema de conexao: " + ex.getMessage());
        }
    }
D

Duas perguntas, não está dando erro algum!? Por que está usando while (rs.next()) se depois você atualiza o ponteiro para o final com rs.last(); , não era mais fácil verificar se if(!rs.next) ?

Abraços

pmlm

E para que ir buscar todos se só queres o último?

SELECT max(nvl(idOrdem,0)+1 from ordemserv
Willdoidao

Mudei o codigo ficou assim:

public void carregaCodigoOs() {

        Connection conn = new coneccao().conectar();
        ResultSet rs = null;
        try {
            // Cria e executa uma instru��o SQL
            MeuState = conn.createStatement();
        } catch (SQLException ex) {
            ex.printStackTrace();
            JOptionPane.showMessageDialog(null, "erro de STATEMENT");
        }
        try {
            rs = MeuState.executeQuery("select idOrdem from ordemserv order by idOrdem");
            if(!rs.next()){
                int Cod = rs.getInt("idOrdem");
                Cod = Cod + 1;
                CodS = String.valueOf(Cod);
            }

        } catch (SQLException ex) {
            JOptionPane.showMessageDialog(null, "Problema de conexao: " + ex.getMessage());
        }
    }

Mas mesmo assim nw esta funcionando nem dando erro, o que quero é pegar o ultimo id da tabela e somar mais um (+1) e depois mandar ele para um Jtext para mostrar ao usuario. Nw endenti ainda aonde estou errado, alguem tem alguma idea?

ViniGodoy
a) Não use queries para descobrir últimos IDs e somar + 1. Isso não  é muito pouco eficiente, como também não funciona bem em multiplas transações ou threads;

b) Você deve fechar as conexões, resultset e statements após utiliza-los. De preferencia, faça isso num bloco finally;

c) Ao invés de um while, é mais eficiente fazer assim:

d) Trate corretamente as exceptions.  imprimir a mensagem é abrir mão do StackTrace, que geralmente traz informações valiosíssimas de onde o problema se encontra;

e) Use um depurador, rode passo-a-passo o código e teste se o fluxo realmente vai por onde você espera, e a tabela retorna o que você imagina.

f) Mesmo que vc prefira continuar ignorando o passo a), ordene em ordem decrescente. Assim, ao invés de um while, você  precisa pegar o valor do id do primeiro registro (que vai ter o maior id) e somar 1.

g) Pense com carinho a classe MeuState e coneccao fazem mesmo sentido. Ou não seria melhor simplesmente elimina-las.
Willdoidao

Cara poderia me dar algum exemplo? Pq to pastando nisso e nw to saindo do lugar!

D

Bom cara, seguinte, você gostaria de saber código de classe de conexão!?

public class Conexao {

    public static Connection abrirConexao() {
        
        Connection con = null;
        try {
            Class.forName("com.mysql.jdbc.Driver");
            String url = "jdbc:mysql://localhost/sexagenarios";
            String user = "root";
            String senha = "";
            con = DriverManager.getConnection(url, user, senha);

        } catch (Exception e) {
            e.printStackTrace();
        }

        return con;
    }
}

Dae uma classe de DAO, que é para inserir, fazer select essas paradas… vc faria mais ou menos assim:

exemplo do codigo:

public class Cadastro {

    public void adicionaCadastroMedico(Medico medico) {
        Connection con = (Connection) Conexao.abrirConexao();
        String sql = "INSERT INTO medico(Nome) VALUES(?)";
        try {
            PreparedStatement stmt = (PreparedStatement) con.prepareStatement(sql);
            stmt.setString(1, medico.getNomeMedico());
            stmt.executeUpdate();
            stmt.close();
            con.close();

        } catch (MySQLIntegrityConstraintViolationException ex) {
            JOptionPane.showMessageDialog(null, "Este nome já foi cadastrado", "Cadastro Médico", JOptionPane.PLAIN_MESSAGE);
        }

    }

Dae basta no codigo vc instanciar um objeto do tipo cadastro e chamar o metodo

fik mais limpo o codigo da classe principal

^^

Willdoidao

Caras ainda nw consegui resolver o problema ainda, fiz como vcs indicaram um classe DAO mas nada de funcionar o estranho é que está incluindo mas nw consigo buscar o ID e voltar no campo.
Classe DAO:

public class BancoDados {
    
    private Connection conexao;	// OBJETO DE CONEXAO 
    private ResultSet rs;	// OBJETO DE RESULTADO DE QUERY DE CONSULTA
    private Statement meuState;    
    private String banco = "jdbc:mysql://localhost/mydb";
    private String user = "root";
    private String senha = "otica123";
    
    // ATRIBUTOS PARA CONTROLAR OS ERROS DAS CONSTRAINTS
    // CODIGOS DE ERROS DO MYSQL
    // FICA FACIL A MUDANÇA DE BANCO
    public int erroUnique = 1062;
    public int erroDelete = 1451;
    
       
    // MENSAGEM ERRO
    public void MsgErro(String mensagem)
    {
    	JOptionPane.showMessageDialog(null,mensagem,"Centro de Comunicação UNIRP - ERRO",JOptionPane.ERROR_MESSAGE);
    }
        
    // INICIAR CONEXÃO
    // TODA VEZ QUE É NECESSARIO CONSULTAR O BANCO É FEITO A CONEXAO
    // O SISTEMA NÃO FICARA CONECTADO DIRETO NO BANCO
    private boolean iniciarConexao()
    {
        try
	{
            Class.forName("com.mysql.jdbc.Driver");
            conexao  = DriverManager.getConnection(banco, user, senha);
            meuState = (Statement) conexao.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
            return true;
	}
	catch(ClassNotFoundException ex)
	{
            MsgErro("Driver JDBC não econtrado!");
            return false;
	}
	catch(SQLException ex)
	{
            MsgErro("Falha na conexão com o banco de dados!");
            //MsgErro(ex.getMessage());
            return false;
	}
    }
    
       
    // EXECUTAR INSERT, UPDATE E DELETE
    // RETORNA O ERRO 
    public int executaUpdate(String sql)
    {
        if (iniciarConexao() == true)
        {
            try 
            {
                meuState.executeUpdate(sql);
                conexao.close();
                return 0;
            } 
            catch (SQLException ex) 
            {
                JOptionPane.showMessageDialog(null, "Não consigo cadastrar \n" + ex);
                //MsgErro(String.valueOf(ex.getErrorCode()));
                //MsgErro(ex.getMessage());
                return ex.getErrorCode();                
            }
        }
        else
        {
            return -1;
        }
    }
    
    // EXECUTAR QUERY (CONSULTA)
    // RETORNA O RESULTSET COM A RESPOSTA DA CONSULTA
    public ResultSet executaQuery(String sql)
    {
        if (iniciarConexao() == true)
        {
            try 
            {
                rs = meuState.executeQuery(sql);                
                //conexao.close();
                return rs;
            } 
            catch (SQLException ex) 
            {
                MsgErro(ex.getMessage());
                return null;
            }            
        }
        else
        {
            return null;
        }
    }  
}

Código para buscar o id:

public void carregaCodigoUsuario() {

        String sql = "select idOrdem from ordemserv order by idOrdem";
        BancoDados banco = new BancoDados();
        ResultSet result;

        try {

            result = banco.executaQuery(sql);

            if(!result.next()){

                Num_os.setText("1");
            }
            else{

                result.last();
                String Codigo =result.getString("idOrdem");
                int Cod = Integer.parseInt(Codigo)+1;
                Codigo=String.valueOf(Cod);
                Num_os.setText(Codigo);
            }
        } catch (SQLException e) {
            JOptionPane.showMessageDialog(null, "Erro ResultSet");
        }

    }
D

oq retorna!? da algum erro!?

Tem registros no banco!?

Criado 3 de agosto de 2010
Ultima resposta 13 de ago. de 2010
Respostas 13
Participantes 6