Array
(
)

tratamento de erros do sql no delphi

Mfilho
   - 09 ago 2005

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.

Wfmzip
   - 09 ago 2005

Uma ideia seria vc fazer programaçào triggers ou procedures dentro do sql server mesmo!! Procure saber mais sobre !!

Marlon Spiess
   - 09 ago 2005

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

Mfilho
   - 09 ago 2005

muito obrigado !!!