Duplicidade, contador

Bom é o seguinte…

Esse eh meu codigo de Gravar do formulario

[code]Dvd dvd = new Dvd();

				dvd.setIdDvd(1);
				dvd.setTitulo(txtTitulo.getText());
				dvd.setGenero(txtGenero.getText());
				dvd.setAnoLancamento(txtAnoLancamento.getText());
				dvd.setQuantidade(txtQuantidade.getText());
				dvd.setValorLocacao(txtValorLocacao.getText());
				dvd.setDataCadastro(txtDataCadastro.getText());
				dvd.setAlugado(cboAlugado.getSelectedItem().toString());
				
                String mensagem = dvd.Salvar(dvd);
                
			   JOptionPane.showMessageDialog(null, mensagem);
			   LimpaCampos();[/code]

aqui no codigo dvd.setIdDvd(1); ele informa que o IdDvd vai ser 1.
quando eu fizer o primeiro cadastro ele vai gravar como 1.
mais quando eu for fazer um novo cadastro ele vai gravar como 1 tbm… mais ai vai dar erro de duplicidade

como faço pra quando eu iniciar o formulario…
ele ja busque a quantidade de registros e define o numero total de registros + 1
vai ficar tipo de um contador
contador = Total de registros da tabela + 1
ficaria assim dvd.setIdDvd(contador);

ai ele sempre iria gravar um numero acima do que ja esta gravado no Id, para nao dar duplicidade…

mais como eu faço isso ?
tem jeito mais facil que esse ?

c precisar o codigo do botao gravar ja ta ae…
e a classe ta aqui

[code]package sistema;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import sistema.ConexaoDAO;

public class Dvd {

private int idDvd;
 
private String titulo;
 
private String genero;
 
private String anoLancamento;
 
private String quantidade;
 
private String valorLocacao;
 
private String dataCadastro;
 
private String alugado;

//###################################################

public String getAlugado() {
	return alugado;
}

public void setAlugado(String alugado) {
	this.alugado = alugado;
}

public String getAnoLancamento() {
	return anoLancamento;
}

public void setAnoLancamento(String anoLancamento) {
	this.anoLancamento = anoLancamento;
}

public String getDataCadastro() {
	return dataCadastro;
}

public void setDataCadastro(String dataCadastro) {
	this.dataCadastro = dataCadastro;
}

public String getGenero() {
	return genero;
}

public void setGenero(String genero) {
	this.genero = genero;
}

public int getIdDvd() {
	return idDvd;
}

public void setIdDvd(int idDvd) {
	this.idDvd = idDvd;
}

public String getQuantidade() {
	return quantidade;
}

public void setQuantidade(String quantidade) {
	this.quantidade = quantidade;
}

public String getTitulo() {
	return titulo;
}

public void setTitulo(String titulo) {
	this.titulo = titulo;
}

public String getValorLocacao() {
	return valorLocacao;
}

public void setValorLocacao(String valorLocacao) {
	this.valorLocacao = valorLocacao;
}

//#####################################################

public String Salvar(Dvd dvd) {
	String mensagem = "";
	   
       if (dvd.getIdDvd() == 0)
	       mensagem = "";
       else if (dvd.getTitulo().equals(""))
	            mensagem ="INSIRA UM TITULO - OBRIGATORIO";
       
       else if (dvd.getGenero().equals(""))
                mensagem = "INSIRA UM GENERO - OBRIGATORIO";
       
       else if (dvd.getAnoLancamento().equals(""))
                mensagem ="INSIRA UM ANO DE LANCAMENTO - OBRIGATORIO";
       
       else if (dvd.getQuantidade().equals(""))
    	   		mensagem ="INSIRA UMA QUANTIDADE - OBRIGATORIO";
       
       else if (dvd.getValorLocacao().equals(""))
   				mensagem ="INSIRA UM VALOR DE LOCACAO - OBRIGATORIO";
       
       else if (dvd.getDataCadastro().equals(""))
   				mensagem ="INSIRA UMA DATA DE CADASTRO - OBRIGATORIO";
       
       else if (dvd.getAlugado().equals(""))
   				mensagem ="INFORME SE O DVD ESTA ALUGADO - OBRIGATORIO";
 
       else {
	          Connection conexao =  ConexaoDAO.getconexao(); 
              String sql = "insert into locadoradvd.dvd(iddvd, titulo, genero, anolancamento, quantidade, valorlocacao, datacadastro, alugado) "+
                  "values (?, ?, ?, ?, ?, ?, ?, ?)";
              try {
            	  
        	       mensagem = "DADOS GRAVADOS COM SUCESSO !";
        	       PreparedStatement ps = conexao.prepareStatement(sql);
        	
        	       ps.setInt   (1,dvd.getIdDvd());
        	       ps.setString (2,dvd.getTitulo());
        	       ps.setString (3,dvd.getGenero());
        	       ps.setString(4,dvd.getAnoLancamento());
        	       ps.setString (5,dvd.getQuantidade());
        	       ps.setString (6,dvd.getValorLocacao());
        	       ps.setString(7,dvd.getDataCadastro());
        	       ps.setString (8,dvd.getAlugado());
        	
        	       ps.executeUpdate();
        	       ConexaoDAO.Desconectar();
        	       
              }
              catch(SQLException e){
        	        mensagem="ERRO AO INSERIR DADOS";
        	        e.printStackTrace();
        
              }
              
       }
	
       return mensagem;
}

}[/code]

Vlwss

Você pode fazer uma consulta “SELECT MAX(*) FROM sua_tabela” antes de inserir no BD, pega o resultado e soma 1, ou cria um sequence ou defina o campo campo como autonumeração dependendo do seu BD.

Sugiro criar sequence :wink:
Mais confiável

Deu na mesma
eu nao sei como fazer isso
pod colocar ai como ficaria ?
meu botao gravar e minha classe ja estao ai
vlw

Para criar um sequence no portgresql

CREATE SEQUENCE nome_sequence
  INCREMENT 1
  MINVALUE 1
  MAXVALUE 9223372036854775807
  START 1
  CACHE 1;
ALTER TABLE nome_sequence OWNER TO postgres;

Para consultar o próximo valor da sequence:

select nextval('nome_sequence')

O legal de usar sequence é que o controle fica no SGBD, você só precisa fazer uma consulta no BD e ele já te retorna o valor e sequence e atualiza valor da sequence.

Uma forma mais fácil, nesse caso não precisa passar o campo código (eu acho):
CREATE TABLE sua_tabela(
codigo SERIAL
);

Qual o BD que você usa na sua aplicação?
Tem outras formas, tem que ver o banco que você usa, no mysql tem o autoincrement, você não precisa passar esse campo, é automático

postgre
mais no caso eu nao sei como colocar esse codigo ai

se vc puder passar algo ai, seila, que vc axa mais facil pra eu fazer aqui
vlw

1º Cria sua tabela
CREATE TABLE Cidade (
codigo INT NOT NULL,
uf INT NOT NULL,
nome CHAR(60) NOT NULL,
regiao INT NOT NULL
);

2º Cria sua sequence

CREATE SEQUENCE cidade_codigo MINVALUE 1 START WITH 1 INCREMENT BY 1;

3º Associa a sequence

ALTER SEQUENCE cidade_codigo OWNED BY cidade.codigo;

Antes do código que inseri o registro, tem que fazer uma consulta a sequence para pegar o próximo:

select nextval('cidade_codigo') 

Seu código, acrescente:

String sql = "select nextval('cidade_codigo')";
Statement stmt = conexao.createStatement();
ResultSet rs = stmt.executeQuery(sql);
if(rs.next()){
  //pega o valor no resultset e coloca em uma variavel.
  //objeto.setCodigo(codigo);
}

//executa o resto do código para inserir.

enutam, voltando ao assunto da duplicidade

eu mudei algumas coisas

minha classe cliente ta assim

[code]package sistema;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.PreparedStatement;
import java.sql.Statement;
import java.util.Vector;

import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;

public class Cliente {

private Connection conexao =  null;

private int idCliente;
 
private String nome;
 
private String endereco;
 
private String cidade;
 
private String bairro;
 
private String estado;
 
private String cep;
 
private String rg;
 
private String cpf;
 
private String telefone;
 
private String celular;
 
private String dataNascimento;
 
private String dataCadastro;

private String email;
 
//######################################################

public String getBairro() {
	return bairro;
}

public void setBairro(String bairro) {
	this.bairro = bairro;
}

public String getCelular() {
	return celular;
}

public void setCelular(String celular) {
	this.celular = celular;
}

public String getCep() {
	return cep;
}

public void setCep(String cep) {
	this.cep = cep;
}

public String getCidade() {
	return cidade;
}

public void setCidade(String cidade) {
	this.cidade = cidade;
}

public String getCpf() {
	return cpf;
}

public void setCpf(String cpf) {
	this.cpf = cpf;
}

public String getDataCadastro() {
	return dataCadastro;
}

public void setDataCadastro(String dataCadastro) {
	this.dataCadastro = dataCadastro;
}

public String getDataNascimento() {
	return dataNascimento;
}

public void setDataNascimento(String dataNascimento) {
	this.dataNascimento = dataNascimento;
}

public String getEmail() {
	return email;
}

public void setEmail(String email) {
	this.email = email;
}

public String getEndereco() {
	return endereco;
}

public void setEndereco(String endereco) {
	this.endereco = endereco;
}

public String getEstado() {
	return estado;
}

public void setEstado(String estado) {
	this.estado = estado;
}

public int getIdCliente() {
	return idCliente;
}

public void setIdCliente(int idCliente) {
	this.idCliente = idCliente;
}

public String getNome() {
	return nome;
}

public void setNome(String nome) {
	this.nome = nome;
}

public String getRg() {
	return rg;
}

public void setRg(String rg) {
	this.rg = rg;
}

public String getTelefone() {
	return telefone;
}

public void setTelefone(String telefone) {
	this.telefone = telefone;
}
 
//##################################################

public String Salvar(Cliente cliente) {
	String mensagem = "";
	   
       if (cliente.getIdCliente() == 0)
	       mensagem = "";
       else if (cliente.getNome().equals(""))
	            mensagem ="INSIRA UM NOME - OBRIGATORIO";
       
       else if (cliente.getEndereco().equals(""))
                mensagem = "INSIRA UM ENDERECO - OBRIGATORIO";
       
       else if (cliente.getCidade().equals(""))
                mensagem ="INSIRA UMA CIDADE - OBRIGATORIO";
       
       else if (cliente.getBairro().equals(""))
    	   		mensagem ="INSIRA UM BAIRRO - OBRIGATORIO";
       
       else if (cliente.getEstado().equals(""))
   				mensagem ="INSIRA UM ESTADO - OBRIGATORIO";
       
       else if (cliente.getRg().equals(""))
   				mensagem ="INSIRA UM RG - OBRIGATORIO";
       
       else if (cliente.getCpf().equals(""))
   				mensagem ="INSIRA UM CPF - OBRIGATORIO";
       
       else if (cliente.getTelefone().equals(""))
   				mensagem ="INSIRA UM TELEFONE - OBRIGATORIO";
       
       else if (cliente.getDataNascimento().equals(""))
   				mensagem ="INSIRA UMA DATA DE NASCIMENTO - OBRIGATORIO";
       
       else if (cliente.getDataCadastro().equals(""))
   				mensagem ="INSIRA UMA DATA DE CADASTRO - OBRIGATORIO";
 
       else {

              String sql = "insert into locadoradvd.cliente(idcliente, nome, endereco,cidade, bairro, estado, cep, rg, cpf, telefone, celular, datanascimento, datacadastro, email) "+
                     "values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
              
              try {
		          
	              conexao =  ConexaoDAO.getconexao(); 
	              PreparedStatement ps = conexao.prepareStatement(sql);
	              
        	       mensagem = "DADOS GRAVADOS COM SUCESSO !";
        	       
        	       System.out.println("Cliente " + (obterUltimo()+1));
        	       
        	       ps.setInt   (1,(obterUltimo()+1));
        	       ps.setString (2,cliente.getNome());
        	       ps.setString (3,cliente.getEndereco());
        	       ps.setString(4,cliente.getCidade());
        	       ps.setString (5,cliente.getBairro());
        	       ps.setString (6,cliente.getEstado());
        	       ps.setString(7,cliente.getCep());
        	       ps.setString (8,cliente.getRg());
        	       ps.setString (9,cliente.getCpf());
        	       ps.setString(10,cliente.getTelefone());
        	       ps.setString (11,cliente.getCelular());
        	       ps.setString (12,cliente.getDataNascimento());
        	       ps.setString (13,cliente.getDataCadastro());
        	       ps.setString(14,cliente.getEmail());
        	       
        	       ps.executeUpdate();
              }
              catch(SQLException e){
        	        mensagem="ERRO AO INSERIR DADOS";
        	        e.printStackTrace();
        
              }
              
              ConexaoDAO.Desconectar();
       }
	
       return mensagem;
}
 
public void Alterar(Cliente clienteNovo, Cliente clienteAntigo) {
	//ALTERAR DADOS
}
 
public String Excluir(Cliente cliente) {
	String mensagem = "";
	
	Connection conexao =  ConexaoDAO.getconexao();
	String sql = "delete from locadoradvd.cliente where cliente.codigo = idCliente";
	
	try {
		
		mensagem = "DADOS EXCLUIDOS COM SUCESSO !";
		PreparedStatement ps = conexao.prepareStatement(sql);
		
		ps.setInt(1,cliente.getIdCliente());
		ps.executeUpdate();
		ConexaoDAO.Desconectar();
	}
	catch(SQLException e){
        mensagem = "ERRO AO EXCLUIR DADOS";
        e.printStackTrace();
  }
	
	return mensagem;
}
 
public void Buscar(Cliente cliente) {
	//BUSCA DADOS
}

public int obterUltimo() throws SQLException{
	int codigo = 0;
	String sql = "select max(idcliente) as ultimo from locadoradvd.cliente";

	Statement stmt = conexao.createStatement();
	ResultSet rs = stmt.executeQuery(sql);
	if (rs.next()) {
		 codigo = rs.getInt("ultimo");
		 System.out.println("passei outro codigo ");
	}
	else {
		System.out.println("passei codigo zero");
		codigo = 0;
	}
	
	return codigo;
}  

}

[/code]

Olha o metodo ObterUltimo
fiz isso para nao ter mais duplicidade no banco quando gravar
mais eu gravo a primeira vez e blz.
mais quando gravo a segunda vez, ele retorna esse erro

[color=red]Exception in thread “AWT-EventQueue-0” java.lang.NullPointerException
at sistema.Cliente.Salvarb[/b]
at sistema.CadastroClientes$1.actionPerformed(CadastroClientes.java:563)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)[/color]

ai eu clico nesse item em negrito ai pra ver onde ta o erro, ele retorna essa linha aqui da classe Cliente no Metodo Salvar

mais essa linha nao contem erros…

o que fazer ? ow o que esta errado ai ?

VLWW

Pelo que vi, você tem que fechar os PreparedEstatement, ResultSet, e Connection para liberar os recursos, acho que é isso. Tenta e depois fala se funcionou.

e como fecha isso ?
e aonde fecho ?

tem que ser nessa ordem e antes de fechar verifique se o objeto é diferente de null, e tem que está em um bloco de try catch.

1º rs.close();//ResultSet
2º ps.close();//PreparedStatement
3º con.close();//con.close();