Tratamento de exceção em chave primária

1 resposta
L

Como que eu faço um tratamento de exceção sql, para não deixar que o usuário digite um código da conta, que já exista!
Não pode ser gerado automaticamente no banco.
acho q eu try catch resolve. mas não sei onde colocá-lo!
segue o código

String cadastraContas = "insert into tb_planodecontas (pk_cod_conta, descricao, natureza, tipo, dispo_imed, situacao) " +
            "values (?,?,?,?,?,?)";

 public void cadastrarContas(PlanodecontasValendo planodecontas){
        try{
            pstm = firebird.conectar().prepareStatement(cadastraContas);
            pstm.setString(1, planodecontas.getCodigo());
            pstm.setString(2, planodecontas.getDescricao());
            pstm.setString(3, planodecontas.getNatureza());
            pstm.setString(4, planodecontas.getTipo());
            pstm.setString(5, planodecontas.getDisponivel());
            pstm.setString(6, planodecontas.getSituacao());
            pstm.executeUpdate();
            firebird.desconectar();
            
        }catch(Exception e){
            e.printStackTrace();
        }        
    }

private void cadastraContas(){
        if (tfCodigoConta.getText().trim().equals("")) {
            JOptionPane.showMessageDialog(this, "Informe o Código da Conta.");
            tfCodigoConta.requestFocus();
        } else if (tfDescricaoConta.getText().trim().equals("")) {
            JOptionPane.showMessageDialog(this, "Informe a Descrição da Conta.");
            tfDescricaoConta.requestFocus();
        } else if (cbNatureza.getSelectedItem() == null) {
            JOptionPane.showMessageDialog(this, "Informe a Natureza da Conta.");
            cbNatureza.requestFocus();
        } else if (cbTipo.getSelectedItem() == null) {
            JOptionPane.showMessageDialog(this, "Informe o Tipo da Conta.");
            cbTipo.requestFocus();
        } else if (cbDisponibilidade.getSelectedItem() == null) {
            JOptionPane.showMessageDialog(this, "Informe se a Conta representa um recurso Disponível Imediato.");
            cbDisponibilidade.requestFocus();
        } else {  
        PlanodecontasControle pc = new PlanodecontasControle();
        PlanodecontasValendo planodecontas = new PlanodecontasValendo();
        planodecontas.setCodigo(tfCodigoConta.getText());
        planodecontas.setDescricao(tfDescricaoConta.getText());
        planodecontas.setNatureza(cbNatureza.getSelectedItem().toString());
        planodecontas.setTipo(cbTipo.getSelectedItem().toString());
        planodecontas.setDisponivel(cbDisponibilidade.getSelectedItem().toString());
        planodecontas.setSituacao(cbSituacao.getSelectedItem().toString());
        pc.cadastrarContas(planodecontas);
        JOptionPane.showMessageDialog(this, "Nova Conta incluída com sucesso.");
        desabilitaCampos();
        }
    }

1 Resposta

discorpio

Boa noite.

Tem como fazer isto dentro do banco e também via aplicação.

Na aplicação você terá que criar um método, de preferência que retorne um valor booleano, para fazer uma pesquisa na tabela antes, se o registro já existe lá, em caso afirmativo, o método retornaria um valor True, e ai você trataria a exceção.

Já dentro do banco, dependendo do SGDB que você está usando, você pode definir o campo número da conta como chave primária, e criar uma crítica (constraint) para ela, assim:

ALTER TABLE nome_tabela ADD CONSTRAINT pk_conta PRIMARY KEY(num_conta);

Detalhe, se você não criar esta constraint dentro do banco e definiu outro campo tipo auto-incremento como chave primária, você correrá o risco de duplicar números de contas, mesmo que trate uma exceção dentro da aplicação para isto, pois a constraint não foi definida no campo número de conta e sim no campo auto-incremento, e por isso não dispararia a exceção.

Caso você não queira que o número de conta não seja a chave primária, pode defini-lo como “Unique”.

ALTER TABLE produtos ADD CONSTRAINT unique_num_conta UNIQUE (num_conta);

// Ou na criação da tabela.


CREATE TABLE conta 
(
   num_conta VARCHAR(10) UNIQUE,
   ....
   ....
);

Pronto, dentro do banco você já garantiu uma restrição de duplicação de registro, que vai disparar uma exceção direta do banco para a aplicação. Vale lembrar que este dialeto SQL que digitei acima pertence ao SGDB PostGreSQL, já os de outros bancos, não me lembro agora como se faz.

Um abraço.

Criado 28 de março de 2012
Ultima resposta 28 de mar. de 2012
Respostas 1
Participantes 2