Pegar código automático do banco e jogar em jtextfield

Boa noite galera…

Estou criando um código para quando o usuário clicar no botão Novo, ele apague tudo que tiver nos jTextField, e no jTextField correspondente ao campo ID ele retorne o valor sucessor do ultimo que foi registrado. Exemplo (se eu cadastrei 17 clientes, quando clicar em Novo, automaticamente no campo ID vai aparece o numero 18) porém não está dando certo, alguém poderia ver se minha lógica está certa.

          try{
        
           conn = (Connection) DriverManager.getConnection(url+dbName,"root","");
           ResultSet rs = null;
           Statement stmt = (Statement) conn.createStatement();
       
          stmt.execute("select * from clientes");
           rs.last();
           
           int ult = rs.getInt("id")+1;
           jTextField38.setText(""+ult);
           
       }catch(SQLException erro){
           JOptionPane.showMessageDialog(null, "Não deu certo");
           
       }

Agradeço galera

Teu rs e null

Teria que ser como então?

Não está certa.

a) Não tem porque fazer o cast de Connection para Connection, nem de Statement para Statement;
b) O comando last() só funciona em resultSets navegáveis. Por padrão, os resultSets são FORWARD_ONLY;
c) Listar o banco de dados inteiro só para pegar o último id é um desperdício enorme de recursos;
d) O último id que sua query ver pode não ser mais o próximo id, se alguém cadastrar algum cliente na rede enquanto o usuário digita os dados deste.
e) Sem a clausula ORDER BY, alguns bancos de dados não dão qualquer garantia sobre que ordenação os registros vão ter.
f) Faltou fechar a conexão, o statement e o resultset, preferencialmente num bloco finally, ou cria-los no try with resources, se estiver usando Java 7.
g) Você está passando null no primeiro parâmetro do JOptionPane. O certo é passar ali a referência para a janela que abriu o JOptionPane (normalmente this ou NomeDaClasseDaJanela.this).

No mínimo, se o seu sistema não for multi-usuário, você deveria fazer assim:

[code]PreparedStatement stmt = null;
ResultSet rs = null;

try{
conn = DriverManager.getConnection(url+dbName,“root”,"");
stmt = conn.prepareStatement(“SELECT TOP 1 id FROM clientes ORDER BY id DESC”);
rs = stmt.executeQuery();

if (rs.next()) {           
    int ult = rs.getInt("id")+1;
    jTextField38.setText(""+ult);           
}

} catch(SQLException erro) {
JOptionPane.showMessageDialog(this, “Não deu certo”);
} finally {
try { if (rs != null) rs.close(); } catch (SQLException err) {}
try { if (stmt != null) stmt.close(); } catch (SQLException err) {}
try { if (conn != null) conn.close(); } catch (SQLException err) {}
} [/code]

Boa tarde

Obrigado pela ajuda Viny, eu fiz o código como você orientou, rodo certinho, mas o problema é que ele está caindo direto no catch, não chega nem a passa perto do if, por que será?
Em relação ao cast do connection e do statement, só funciona se for assim…se eu não faço, não dá certo, não entendo porque
Segue abaixo meu código:

try{
    conn =  (Connection) DriverManager.getConnection(url+dbName,"root","");    
  Statement  stmt =  (Statement) conn.prepareStatement("SELECT TOP 1 id FROM clientes ORDER BY id DESC");
    ResultSet rs = stmt.executeQuery("SELECT TOP 1 id FROM clientes ORDER BY id DESC");

    if (rs.next()) {           
        int ult = rs.getInt("id")+1;
        jTextField8.setText(""+ult);           
    }
} catch(SQLException erro) {
           
} finally {


   try { if (conn != null) conn.close(); } catch (SQLException err) {}
} 
           
        jTextField38.setText("");
        jTextField2.setText("");
        jTextField3.setText("");
        jTextField4.setText("");
        jTextField5.setText("");
        jTextField6.setText("");
        jTextField7.setText("");
        jFormattedTextField1.setText("");
        jTextField9.setText("");
        jTextField10.setText("");
        jTextField11.setText("");
        jTextField12.setText("");
        jTextField13.setText("");
        jTextField14.setText("");
        jTextField15.setText("");
        jTextField41.setText("");
        jTextField40.setText("");
        jTextField8.setText("");
         
        jTextField8.requestFocus();

O seu import, logo no início do programa, deve estar errado. Você deve estar importando uma classe diferente de java.sql.Connection, java.sql.Statement e java.sql.ResultSet.
Geralmente o pessoal erra ao importar com.mysql.Connection, com.mysql.Statement e com.mysql.ResultSet.

Outra coisa, altere o seu catch para exibir o erro. Senão vai ficar muito difícil corrigir o código.

Além disso, você não copiou exatamente o que eu fiz. Note que meu método executeQuery() não recebe parâmetros, e que o meu Statement, na verdade, é um PreparedStatement.

Então Viny, fiz como você disse.Segue abaixo o código

import com.mysql.jdbc.Connection;
import com.mysql.jdbc.PreparedStatement;


import com.mysql.jdbc.Statement;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;


      Connection conn = null;
        String url = "jdbc:mysql://localhost:3306/";
        String dbName = "test";
        String driver = "com.mysql.jdbc.Driver";
        
  




try{
    conn =  (Connection) DriverManager.getConnection(url+dbName,"root","");    
  Statement  stmt =  (Statement) conn.prepareStatement("SELECT TOP 1 id FROM clientes ORDER BY id DESC");
    ResultSet rs = stmt.executeQuery("SELECT TOP 1 id FROM clientes ORDER BY id DESC");

    if (rs.next()) {           
        int ult = rs.getInt("id")+1;
        jTextField8.setText(""+ult);           
    }
} catch(SQLException erro) {
           JOptionPane.showMessageDialog(this, "Não deu certo");             
} finally {


   try { if (conn != null) conn.close(); } catch (SQLException err) {}
} 
           
        jTextField38.setText("");
        jTextField2.setText("");
        jTextField3.setText("");
        jTextField4.setText("");
        jTextField5.setText("");
        jTextField6.setText("");
        jTextField7.setText("");
        jFormattedTextField1.setText("");
        jTextField9.setText("");
        jTextField10.setText("");
        jTextField11.setText("");
        jTextField12.setText("");
        jTextField13.setText("");
        jTextField14.setText("");
        jTextField15.setText("");
        jTextField41.setText("");
        jTextField40.setText("");
        jTextField8.setText("");
         
        jTextField8.requestFocus();

Gostaria de saber se é assim mesmo que você sugeriu, pois ainda não funciona

Obrigado pela ajuda

Não, o certo é assim:

//Nunca importe com.mysql.jdbc. import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.Statement; import java.sql.DriverManager; import java.sql.SQLException;

[code]
Connection conn = null;

//Use PreparedStatement
PreparedStatement stmt = null;

ResultSet rs = null;

String url = “jdbc:mysql://localhost:3306/”;
String dbName = “test”;
String driver = “com.mysql.jdbc.Driver”;

try{
//Não tem casts aqui. Você era obrigado a por pq usava os imports errados.
conn = DriverManager.getConnection(url+dbName,“root”,"");
stmt = conn.prepareStatement(“SELECT id FROM clientes ORDER BY id DESC LIMIT 1”);

//Não tem consulta no executeQuery
rs = stmt.executeQuery();

if (rs.next()) {           
    int ult = rs.getInt("id")+1;
    jTextField8.setText(""+ult);           
}

} catch(SQLException erro) {
JOptionPane.showMessageDialog(this, “Não deu certo”);
erro.printStackTrace(); //Não é uma boa ignorar mensagens de erro!
} finally {
//Você também deve fechar a o statement e o resultset
try { if (rs != null) rs.close(); } catch (SQLException err) {}
try { if (stmt != null) stmt.close(); } catch (SQLException err) {}
try { if (conn != null) conn.close(); } catch (SQLException err) {}
}

//O resto dos campos vc limpa normal aqui embaixo[/code]

Outra coisa. Procure dar nomes descritivos para seus JTextFields. Fica bem difícil entender seu código com as coisas chamando jTextField8, JTextField35, etc… pq não chamar de txtId, txtNome, etc? Você pode ter vários problemas, ser iniciante, e não compreender a linguagem, mas não tem desculpa para ser também preguiçoso.

Finalmente, o TOP 1 era sintaxe do SQL Server, desculpe. O certo no MySQL era LIMIT 1, por isso sua consulta não estava funcionando. De qualquer jeito, é sempre uma boa idéia exibir a exceção do erro, mesmo que seja apenas no console. Assim você não fica as cegas se o código não funcionar e pode dizer qual foi o problema, ao invés de simplesmente dizer que o código “não funciona”.

1 curtida