Gerar numero sequencial

Pessoal,

Como eu posso gerar um numero sequencial depois de uma gravação no banco de dados, faco o insert em uma tabela, depois disso o sistema gera um número, como eu posso fazer isso ??

nao tenho ideia de como fazer isso, so pensei na forma de incrementar algo depois da inserção, alguem pode me ajudar ?

valew

[]s

marsola2k, cara normalmente é bom deixar isso por conta do banco com um auto increment ou uma triger, pois deixando sua aplicação cuidar disso vc pode ter vários problemas gerando números errados principalmente se for uma aplicação com grande concorrência mas segue um código para ger id na aplicação, se for uma aplicação pequena pode usar assim sem problemas

public Integer gerId() throws Exception { Integer idCliente = null; ResultSet rs = null; Connection conn = null; PreparedStatement ps = null; try { conn = getConnection(); String sql = "SELECT MAX(ID_CLIENTE)+1 ID_CLIENTE FROM TB_CLIENTE"; ps = conn.prepareStatement( sql ); rs = ps.executeQuery(); if( rs.next() ) { idCliente = new Integer(rs.getInt("ID")); } else { idCliente = new Integer(1); } } finally { if(rs!=null) try { rs.close(); } catch( Exception e ) {} if(ps!=null) try { ps.close(); } catch( Exception e ) {} if(ps!=null) try { conn.close(); } catch( Exception e ) {} } return id; }

valew Rocha, tinha visto um post seu a respeito disso, vou adaptar ao meu codigo e te falo o que aconteceu, é uma aplicacao pequena por enquanto, mas pode se tornar grande, de acordo com sua aceitação !!
para testes vai rodar apenas em uma maquina.

mas valew pela ajuda

Rcha, eu nao tinha visto, mas uma duvida, se eu estou inserindo um valor na tabela, eu teria que adicionar esse valor e nao pesquisar, conforme esta abaixo:

[quote] try {
conn = getConnection();
String sql = “SELECT MAX(ID_CLIENTE)+1 ID_CLIENTE FROM TB_CLIENTE”;
ps = conn.prepareStatement( sql );
rs = ps.executeQuery();
if( rs.next() ) {
idCliente = new Integer(rs.getInt(“ID”));
} else {
idCliente = new Integer(1);
}
[/quote]

A query

String sql = "SELECT MAX(ID_CLIENTE)+1 ID_CLIENTE FROM   TB_CLIENTE";

nao deveria ser algo do tipo

String query = "INSERT INTO tbl_vendas MAX(NovaOS)+1 ID_CLIENTE
VALUES (NovaOS)";

Se eu entendi direito, MAX(id) não é o melhor jeito de fazer isso.

Pegue o valor das chaves geradas via JDBC mesmo.

Não pelo seguinte vc faz uma pesquisa no bd para pegar o maior valor dai soma mais um a ele entendeu?

entendi, eu faco a verificacao primeiro e depois eu incremento, feito isso eu gravo no banco.
pcalcado nao sabia do getGeneratedKeys

valew

Se você fizer um slect depois o insert vai ter que fazer lock na tabela, ou pdoe ter problemas de concorrência. Se você vai usar os mecanismos do SGBD para gerar chaves, use também os para recuperar as chaves :wink:

O MAX(), como o phillip disse, nao eh uma boa opcao. O correto eh usar o suporte do banco para isso. No mysql tem as keys auto_increment, em oracle, postgresql e etc tem sequences, e assim por diante.

No caso do mysql, voce pode pegar a ultima key gerada usando o suporte do JDBC para isso. Eh algo como

PreparedStatement p = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
...
p.executeUpdate();

// Pega o id
ResultSet rs = p.getGeneratedKeys();
rs.next();
int id = rs.getInt(1);
rs.close();

// ...

Em bancos que usam sequences, eh necessario fazer um SELECT a parte para consultar o ultimo valor gerado da mesma.

Rafael

Em fim … qual o banco que voce está utilizando?

Outra opção,alem das que a galera ja falou, seria trabalhar com triggers caso seu banco tenha suporte!
Trigger como o proprio nome diz são gatilhos, ou seja, quando acontesse alguma ação no banco ele dispara um evento que pode ser antes ou depois de uma inserção, deleçao ou atualização.

Eu pelo menos utilizo triggers quando o banco nao tem auto incremento em chaves primarias. Na verdade, se nao me engano, esses bancos que tem auto incremento estão é utilizando de triggers so que o usuario nao ve.

Bom … é so mais uma opção!