tratamento de erros do sql no delphi
09/08/2005
0
Tenho um sistema em delphi 7 com sql server, gostaria de criar uma função para tratar os erros do sql (ocorridos nas transações)
Alguem poderia me ajudar (com uma dica)?
Obrigado.
Alguem poderia me ajudar (com uma dica)?
Obrigado.
Mfilho
Curtir tópico
+ 0
Responder
Posts
09/08/2005
Wfmzip
Uma ideia seria vc fazer programaçào triggers ou procedures dentro do sql server mesmo!! Procure saber mais sobre !!
Responder
09/08/2005
Marlon Spiess
Função pra tratar erros
function TrataErrosBDE(Erro : Exception; Tabela : TTable) : String;
var
NomeTab, Campo : String;
iErro : TDBError;
begin
NomeTab := Tabela.TableName;
if Erro is EDBEngineError then
begin
iErro := (Erro as EDBEngineError).Errors[0];
case iErro.ErrorCode of
// Erros do Sistema
8449 : Result := ´Um arquivo do sistema não pode ser aberto.´;
8451 : Result := ´Estrutura de dados corrompida.´;
// Erros de Dados Físicos Corrompidos
8961 : Result := Format(´Cabeçalho da tabela/índice ´´¬s´´ está corrompido.´, [ExtractFileName(Copy(iErro.Message, 8, 999))]);
8962 : Result := Format(´Tabela ´´¬s´´ está corrompida.´, [NomeTab]);
8963 : Result := ´Arquivo Memo/BLOB corrompido.´;
8964 : Result := ´Bitmap corrompido ( Erro Interno ).´;
8965 : Result := Format(´Índice da tabela ´´¬s´´ está corrompido.´, [NomeTab]);
8966 : Result := ´Arquivo de bloqueio corrompido.´;
8967 : Result := ´Arquivo de família corrompido.´;
8968 : Result := ´Arquivo .VAL faltando ou corrompido.´;
8969 : Result := ´Formato de arquivo-índice desconhecido.´;
// Erros de Entrada e Saída Relacionados com Arquivos
9217 : Result := ´Erro de leitura.´;
9218 : Result := ´Erro de escrita.´;
9219 : Result := ´Não é possível acessar o diretório.´;
9220 : Result := ´Não é possível realizar a operação de remoção do arquivo.´;
9221 : Result := ´Não é possível acessar o arquivo.´;
9222 : Result := ´O acesso à tabela está desativado devido a um erro anterior.´;
// Erros de Resursos ou Limites
9473 : Result := ´Memória insuficiente para esta operação.´;
9479 : Result := ´A tabela está cheia.´;
// Erros de Validação
9729 : Result := ´Registro já Existente.´+#10+´Campo chave duplicado.´;
// Erros de Requisição Inválidas
9985 : Result := ´O número está fora dos limites aceitáveis.´;
9997 : Result := Format(´Índice da tabela ´´¬s´´ não existe.´, [NomeTab]);
10014: Result := Format(´Banco de dados ´´¬s´´ desconhecido.´, [Tabela.DatabaseName]);
10018: Result := Format(´Diretório Inválido.´+10+´´´¬s´´´, [ExtractFilePath (Copy(iErro.Message, 12, 999))]);
11010: Result := Format(´Tabela ´´¬s´´´ + ^M + ´não existe ou não foi encontrada no banco de dados ´´¬s´´.´, [NomeTab, Tabela.DatabaseName]);
11011: Result := Format(´Diretório ´´¬s´´´ + ^M + ´não existe ou não foi encontrado.´, [ExtractFilePath(Copy(iErro.Message, 7, 999))]);
// Erros de Violação de Bloqueio
10241: Result := ´Registro bloqueado por outro usuário.´;
10242: Result := ´O desbloqueio não foi bem-sucedido.´;
10243: Result := ´A tabela está ocupada.´;
10244: Result := ´O diretório está ocupado.´;
10245: Result := ´O arquivo esta bloqueado.´;
10246: Result := ´O diretório está bloqueado.´;
10247: Result := ´O Registro já está bloqueado nesta sessão.´;
10248: Result := ´O objeto não está bloqueado.´;
10249: Result := ´Tempo de bloqueio excessivo.´;
10250: Result := ´O grupo da chave está bloqueado.´;
10251: Result := ´O bloqueio da tabela foi perdido.´;
10252: Result := ´O acesso exclusivo foi perdido.´;
10253: Result := ´A tabela não pode ser aberta em modo exclusivo.´;
10254: Result := ´Há um conflito de bloqueio de registro nesta sessão.´;
10255: Result := ´Ocorreu um impasse de bloqueio.´;
10256: Result := ´Uma transação de usuário está atualmente em progresso.´;
10257: Result := ´Nenhuma transação de usuário está atualmente em progresso.´;
10258: Result := ´O bloqueio de registro não foi bem-sucedido.´;
10259: Result := ´A edição não pode ser concretizada porque outro usuário alterou o registro.´;
10260: Result := ´A edição não pode ser concretizada porque outro usuário cancelou ou movimentou o registro.´;
// Erros de Rede
11265: Result := ´A inicialização da rede não foi bem-sucedida.´;
11266: Result := ´O limite de usuários na rede foi ultrapassado.´;
11267: Result := ´Versão errada do arquivo .NET.´;
11268: Result := ´Não é possível bloquear o arquivo na rede.´;
11269: Result := ´O diretório não é pessoal.´;
11270: Result := ´Estão sendo usados múltiplos arquivos .NET.´;
11271: Result := ´Erro de rede desconhecido.´;
11272: Result := ´Não está inicializado para acessar os arquivos da rede.´;
11273: Result := ´O SHARE não foi carregado. Ele é necessário para compartilhar os arquivos locais.´;
11274: Result := ´Você não esta em uma rede, não esta conectado a ela.´;
11275: Result := ´A comunicação com o servidor SQL foi perdida.´;
11276: Result := ´A comunicação com o servidor IDAPi foi perdida.´;
else
Result := Format(´Erro na abertura da Tabela ´´¬s´´.´ + ^M + ´Código do Erro: ¬s´ + ^M + ´Mensagem: ¬s´, [NomeTab, IntToStr(iErro.ErrorCode), iErro.Message]);
end;
end else
if Erro is EDatabaseError then
if UpperCase(Copy(Erro.Message, 1, 5)) = ´FIELD´ then
begin
Campo := Copy(Erro.Message, 7, Pos(´´´ ´, Erro.Message) -6);
if UpperCase(Copy(Erro.Message, Pos(´´´ ´, Erro.Message), 3)) = ´NOT´ then
Result := Format(´Campo ´´¬s´´ não está na estrutura da´ + ^M + ´tabela ´´¬s´´.´, [Campo, NomeTab])
else
Result := Format(´Campo ´´¬s´´ da tabela ´´¬s´´´ + ^M + ´não é do tipo ou tamanho esperado.´, [Campo, NomeTab]);
end else
Result := Format(´Erro na abertura da tabela ´´¬s´´.´ + ^M + ´Mensagem: ¬s´, [NomeTab, Erro.Message])
else
Result := Format(´Erro na abertura da tabela ´´¬s´´.´ + ^M + ´Mensagem: ¬s´, [NomeTab, Erro.Message]);
end;
Espero ter ajudado
function TrataErrosBDE(Erro : Exception; Tabela : TTable) : String;
var
NomeTab, Campo : String;
iErro : TDBError;
begin
NomeTab := Tabela.TableName;
if Erro is EDBEngineError then
begin
iErro := (Erro as EDBEngineError).Errors[0];
case iErro.ErrorCode of
// Erros do Sistema
8449 : Result := ´Um arquivo do sistema não pode ser aberto.´;
8451 : Result := ´Estrutura de dados corrompida.´;
// Erros de Dados Físicos Corrompidos
8961 : Result := Format(´Cabeçalho da tabela/índice ´´¬s´´ está corrompido.´, [ExtractFileName(Copy(iErro.Message, 8, 999))]);
8962 : Result := Format(´Tabela ´´¬s´´ está corrompida.´, [NomeTab]);
8963 : Result := ´Arquivo Memo/BLOB corrompido.´;
8964 : Result := ´Bitmap corrompido ( Erro Interno ).´;
8965 : Result := Format(´Índice da tabela ´´¬s´´ está corrompido.´, [NomeTab]);
8966 : Result := ´Arquivo de bloqueio corrompido.´;
8967 : Result := ´Arquivo de família corrompido.´;
8968 : Result := ´Arquivo .VAL faltando ou corrompido.´;
8969 : Result := ´Formato de arquivo-índice desconhecido.´;
// Erros de Entrada e Saída Relacionados com Arquivos
9217 : Result := ´Erro de leitura.´;
9218 : Result := ´Erro de escrita.´;
9219 : Result := ´Não é possível acessar o diretório.´;
9220 : Result := ´Não é possível realizar a operação de remoção do arquivo.´;
9221 : Result := ´Não é possível acessar o arquivo.´;
9222 : Result := ´O acesso à tabela está desativado devido a um erro anterior.´;
// Erros de Resursos ou Limites
9473 : Result := ´Memória insuficiente para esta operação.´;
9479 : Result := ´A tabela está cheia.´;
// Erros de Validação
9729 : Result := ´Registro já Existente.´+#10+´Campo chave duplicado.´;
// Erros de Requisição Inválidas
9985 : Result := ´O número está fora dos limites aceitáveis.´;
9997 : Result := Format(´Índice da tabela ´´¬s´´ não existe.´, [NomeTab]);
10014: Result := Format(´Banco de dados ´´¬s´´ desconhecido.´, [Tabela.DatabaseName]);
10018: Result := Format(´Diretório Inválido.´+10+´´´¬s´´´, [ExtractFilePath (Copy(iErro.Message, 12, 999))]);
11010: Result := Format(´Tabela ´´¬s´´´ + ^M + ´não existe ou não foi encontrada no banco de dados ´´¬s´´.´, [NomeTab, Tabela.DatabaseName]);
11011: Result := Format(´Diretório ´´¬s´´´ + ^M + ´não existe ou não foi encontrado.´, [ExtractFilePath(Copy(iErro.Message, 7, 999))]);
// Erros de Violação de Bloqueio
10241: Result := ´Registro bloqueado por outro usuário.´;
10242: Result := ´O desbloqueio não foi bem-sucedido.´;
10243: Result := ´A tabela está ocupada.´;
10244: Result := ´O diretório está ocupado.´;
10245: Result := ´O arquivo esta bloqueado.´;
10246: Result := ´O diretório está bloqueado.´;
10247: Result := ´O Registro já está bloqueado nesta sessão.´;
10248: Result := ´O objeto não está bloqueado.´;
10249: Result := ´Tempo de bloqueio excessivo.´;
10250: Result := ´O grupo da chave está bloqueado.´;
10251: Result := ´O bloqueio da tabela foi perdido.´;
10252: Result := ´O acesso exclusivo foi perdido.´;
10253: Result := ´A tabela não pode ser aberta em modo exclusivo.´;
10254: Result := ´Há um conflito de bloqueio de registro nesta sessão.´;
10255: Result := ´Ocorreu um impasse de bloqueio.´;
10256: Result := ´Uma transação de usuário está atualmente em progresso.´;
10257: Result := ´Nenhuma transação de usuário está atualmente em progresso.´;
10258: Result := ´O bloqueio de registro não foi bem-sucedido.´;
10259: Result := ´A edição não pode ser concretizada porque outro usuário alterou o registro.´;
10260: Result := ´A edição não pode ser concretizada porque outro usuário cancelou ou movimentou o registro.´;
// Erros de Rede
11265: Result := ´A inicialização da rede não foi bem-sucedida.´;
11266: Result := ´O limite de usuários na rede foi ultrapassado.´;
11267: Result := ´Versão errada do arquivo .NET.´;
11268: Result := ´Não é possível bloquear o arquivo na rede.´;
11269: Result := ´O diretório não é pessoal.´;
11270: Result := ´Estão sendo usados múltiplos arquivos .NET.´;
11271: Result := ´Erro de rede desconhecido.´;
11272: Result := ´Não está inicializado para acessar os arquivos da rede.´;
11273: Result := ´O SHARE não foi carregado. Ele é necessário para compartilhar os arquivos locais.´;
11274: Result := ´Você não esta em uma rede, não esta conectado a ela.´;
11275: Result := ´A comunicação com o servidor SQL foi perdida.´;
11276: Result := ´A comunicação com o servidor IDAPi foi perdida.´;
else
Result := Format(´Erro na abertura da Tabela ´´¬s´´.´ + ^M + ´Código do Erro: ¬s´ + ^M + ´Mensagem: ¬s´, [NomeTab, IntToStr(iErro.ErrorCode), iErro.Message]);
end;
end else
if Erro is EDatabaseError then
if UpperCase(Copy(Erro.Message, 1, 5)) = ´FIELD´ then
begin
Campo := Copy(Erro.Message, 7, Pos(´´´ ´, Erro.Message) -6);
if UpperCase(Copy(Erro.Message, Pos(´´´ ´, Erro.Message), 3)) = ´NOT´ then
Result := Format(´Campo ´´¬s´´ não está na estrutura da´ + ^M + ´tabela ´´¬s´´.´, [Campo, NomeTab])
else
Result := Format(´Campo ´´¬s´´ da tabela ´´¬s´´´ + ^M + ´não é do tipo ou tamanho esperado.´, [Campo, NomeTab]);
end else
Result := Format(´Erro na abertura da tabela ´´¬s´´.´ + ^M + ´Mensagem: ¬s´, [NomeTab, Erro.Message])
else
Result := Format(´Erro na abertura da tabela ´´¬s´´.´ + ^M + ´Mensagem: ¬s´, [NomeTab, Erro.Message]);
end;
Espero ter ajudado
Responder
Clique aqui para fazer login e interagir na Comunidade :)