Gerar e Tratar um Exceção de Banco de Dados Interbase
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
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
Curtidas 0
Respostas
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+
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
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+
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
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+
|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