Gerar e Tratar um Exceção de Banco de Dados Interbase

Firebird

21/07/2003

Caros amigos,
parece que cai numa armadilha que não consigo solucionar.
Tenho um form com uma SQL dinâmica que pesquisa um nome de cliente , se ele existe o mesmo é mostrado na tela , se não saio do grid e entro em tela de detalhe para uma inclusão.
Acontece que este form é um form padrão de projeto de onde todos os outros herdam as caracteristicas visuais e de controles.
Uso neste form um conjunto SQL+Provider+ClientDataset+Dataset.
Tudo funciona maravilhosamente bem , exceto a mensagem de erro , quando aplico as atualizações no CDS , e estou testando duplicidade , o registro parece ter entrado no banco e não consigo interceptar o erro de jeito nehum em modo de run-time , somente em modo Run quando o Delphi intercepta o erro , para, e me mostra a mensagem padrao do EIBInterbaseError.
Ja tentei um applicationevents com a seguinte sintaxe
(procedure TFrmPrincipal.ErpEventosException(Sender: TObject; E: Exception);
begin
MessageDlg(´Impossivel Completar a Ação - Verifique.´, mtWarning, [mbOK], 0);
end;
) e ja tentei no form padrao interceptar no botao salvar que contem o seguinte código (
procedure TFrmFormPadrao.BtnSalvarClick(Sender: TObject);
begin
Gravando_Registro;
try
CDSPadrao.ApplyUpdates(-1);
except
begin
on EIBInterbaseError do
ShowMessage(´Impossivel Incluir o Registro´);
Registro_Gravado;
end;
end;
Registro_Gravado;
end;
).

Nenhum do dois funciona em run-time , somente dentro do ambiente a interceptação acontece.
Se alguem já passou por isso , preciso de um Help e agradeço antecipadamente.

Muito Obrigado


Smartsistemas

Smartsistemas

Curtidas 0

Respostas

Afarias

Afarias

21/07/2003

Ok, seu problema não é o Interbase.

Pelo o q vc descreveu me parece ser por causa do CDS. Os CDS transferem as exceções para o evento OnReconcileError.

Utilize este evento (CDS.OnReconsileError) para controlar os erros ocorridos pelo CDS.ApplyUpdates.


Se não for o caso, me dê um toque.


T+


GOSTEI 0
Delmar

Delmar

21/07/2003

Tem como desativar as transações automáticas da dobradinha datasetprovider+clientdatset.
Gostaria de assumir o controle das transações, assim eu poderia fazer o applyupdates de mais de um CDS em uma única transação e garantir a integridade dos dados em caso de falhas.

Já estou fazendo manualmente (contrele explicito), mas percebo que as exceções não conduzem a linha de execução para o exception do try. Será que o datasetprovider desfaz automaticamente a transação mesmo eu tendo iniciado explicitamente a transação.

[color=darkblue:b8ef354823]Pelo o q vc descreveu me parece ser por causa do CDS. Os CDS transferem as exceções para o evento OnReconcileError.[/color:b8ef354823]

Afarias, isto serve como resposta do porquê a linha de execução não vai para o exception do bloco try. Se está certo, parte do questionamento acima que postei a alguns dias em outro tópico está resolvido.

Mas ainda resta

Com o sqlmonitor pude notar que mesmo eu tendo declarado explicitamente a transação (sqlconection.startransaction) houve um rollback (feito automaticamente), pois não entrou no except e tmb não declarei nenhum rollback no evento reconcileError.
Pergunto: tendo iniciado explicitamente porque não permitiu que fizesse rollback explicitamente. Não tem mesmo como desativar estas transações automáticas.
Mesmo declarando explicitamente ó DSP ainda irá startar, comitar e fazer rolback automaticamente? O DSP irá sobrepujar suas transações sobre as transações declaradas explicitamente?

Obrigado pelos preciosos comentários
Um forte abraço
T+


GOSTEI 0
Afarias

Afarias

21/07/2003

|Tem como desativar as transações automáticas da dobradinha
|datasetprovider+clientdatset.

Teoricamente, basta iniciar a transação explicitamente!


|Gostaria de assumir o controle das transações, assim eu poderia fazer o
|applyupdates de mais de um CDS em uma única transação e garantir a
|integridade dos dados em caso de falhas.

As formas mais adequadas de se fazer isso é:

1 - Usando Nested Datasets
2 - Usando o código de fornecido na unit CDSUtils do projeto MIDESS (baixe no SourceForge) -- veja o exemplo que acompanha o pacote


|Já estou fazendo manualmente (contrele explicito), mas percebo que as
|exceções não conduzem a linha de execução para o exception do try.

OnReconcileError


|Será que o datasetprovider desfaz automaticamente a transação mesmo
|eu tendo iniciado explicitamente a transação.

Acredito q não deveria, más me parece q durante um erro é realmente o q ocorre -- talvês seja um *bug*


|Pelo o q vc descreveu me parece ser por causa do CDS. Os CDS
|transferem as exceções para o evento OnReconcileError.

SIM


|Com o sqlmonitor pude notar que mesmo eu tendo declarado
|explicitamente a transação (sqlconection.startransaction) houve um
|rollback (feito automaticamente), pois não entrou no except e tmb não
|declarei nenhum rollback no evento reconcileError.

Não tive tempo para verificar isso. Parace q vc está certo (dentro da abordágem q está dando) - Sugiro q tente as abordágens q sugeri acima.


|Pergunto: tendo iniciado explicitamente porque não permitiu que fizesse
|rollback explicitamente. Não tem mesmo como desativar estas
|transações automáticas.

Desculpe, não sei te responder isso. Se eu tiver um tempinho vou tentar o q vc está fazendo e vejo o q ocorre.


|Mesmo declarando explicitamente ó DSP ainda irá startar, comitar e
|fazer rolback automaticamente?

NÃO -- nos casos normais. Talvês -- em casos de erros na execução do ApplyUpdates.

Vc passa 0 (zero) como parâmetro do ApplyUpdates?? Já tentou passar -1 (menos 1)?? Assim, teoricamente ele não daria ROLLBACK nunca... e provavelmente iria esperar pelo seu COMMIT.


|O DSP irá sobrepujar suas transações sobre as transações declaradas
|explicitamente?

Não deveria


T+


GOSTEI 0
POSTAR