Fórum Exemplo de função para execução rápida de código SQL #371795

01/07/2009

0

Pessoal,

A função abaixo executa rapidamente instruções de SQL. Ela executa todas as 4: INSERT, SELECT, DELETE e UPDATE. Eu a uso quando preciso de instruções rápidas, tipo, retornar um único valor da tabela ou um simples update. Ela está usando ADO mas é facilmente convertida para outras conexões. Eu a uso convertida em FireBird também.

Para quem quiser usar, fique à vontade. Se alguém tiver alguma sugestão de aprimoramente também é bem vinda.

[b:2b4ccc4f68]Exemplo de uso:[/b:2b4ccc4f68]

variável := SQL(´SELECT NOME FROM ALUNOS WHERE CODIGO = 1´, True);


O segundo parâmetro deve ser TRUE ou FALSE. TRUE é para SELECT (é quando retornar valor). Para os demais comandoos é FALSE (não retorna valor).

[b:2b4ccc4f68]Segue o código:[/b:2b4ccc4f68]

function SQL ( s : String; Retorno : Boolean ) : Variant;
var
     FQuery : TADOQuery;
Begin
     FQuery                  := TADOQuery.Create(Nil);
     FQuery.Connection       := frmPrincipal.ADOConnection1;
     FQuery.Sql.Text         := s;

     try
        If Retorno then
        Begin
           FQuery.Open;
           if Not FQuery.Fields[0].IsNull then
           Begin
              SQL := FQuery.Fields[0].Value;
           end else
           begin
              SQL := ´´;
           end;
           FQuery.Close;
        end else
        Begin
           FQuery.ExecSQL;
        end;
     except
        On E: Exception Do
        Begin
           If Pos(UpperCase(´win32 error 10054´), UpperCase(´e.message´)) > 0 Then
           Begin
              Application.MessageBox(´O Servidor está OFFLINE ou foi reiniciado. ´ + 1310 +
                ´Não será possível continuar com o programa. Ele será encerrado.´,
                ´Atenção! SERVIDOR OFFLINE/REINICIADO!´, MB_OK + MB_ICONSTOP + 
                MB_TOPMOST);
              frmPrincipal.ADOConnection1.Destroy;
              Halt(0);
           End Else If Pos(UpperCase(´FAILED TO ESTABLISH A CONNECTION´), UpperCase(´e.message´)) > 0 Then
           Begin
              Application.MessageBox(´PROBLEMA DE COMUNICAÇÃO NA REDE! ´ + #1310 +
                ´Não foi possível o programa se comunicar pela rede (independente do servidor).´ +
                1310 + ´Verifique se o computador está logado na rede, configurado corretamente e outros detalhes pertinentes.´ + 1310 + ´O programa será encerrado.´,
                ´Atenção! PROBLEMA DE COMUNICAÇÃO NA REDE!´, MB_OK + MB_ICONSTOP +
                MB_TOPMOST);
              frmPrincipal.ADOConnection1.Destroy;
              Halt(0);
           End Else
           Begin
              Application.MessageBox(PChar(´Ocorreu um erro no *core* interno de consultas. Verifique:´
                   + #1310 + ´1) Todos os campos foram digitados?´ + 1310 +
                   ´2) Algum campo foi digitado com valor repetido de outro registro (não outro campo)?´
                   + 1310 +
                   ´3) Você mudou alguma configuração da tela enquanto os dados estavam em edição?´
                   + 13101310 +
                   ´Esses procedimentos, quando aplicados, corrigem esse erro.´ +
                   1310 + 1310 +´A mensagem de erro foi:´ + 1310 + UpperCase(E.Message)), ´Atenção!´, MB_OK + MB_ICONSTOP + MB_TOPMOST);
           End;
        End;
     end;

     FQuery.Destroy;
end;



Willian

Willian

Responder

Posts

02/07/2009

.lg.

Gostei da função.
Mas o que não gradei foi usar TADOQuery para executar as instruções [color=blue:6f0d37101a]INSERT[/color:6f0d37101a], [color=blue:6f0d37101a]UPDATE[/color:6f0d37101a] e [color=blue:6f0d37101a]DELETE[/color:6f0d37101a].
Para estas instruções o [b:6f0d37101a]TADOCommand[/b:6f0d37101a] executa muito mais rápido do que o [b:6f0d37101a]TADOQuery[/b:6f0d37101a].

Os erros que vc especificou, podem ser tratados pelos Exception´s. Existe uma exceção específica para cada erro deste. :wink:

Bom trabalho.
Abraços,
.LG.


Responder

Gostei + 0

02/07/2009

Willian

Legal, gostei das sugestões..

Vou tentar aplicá-las nesse fim de semana.


Responder

Gostei + 0

02/07/2009

Willian

.lg.,

Uma dúvida: como eu posso fazer o tratamento de erro dos problemas em específico, como vc citou? Tem como dar o exemplo de pelo menos 1 para eu seguir e implementar o resto?

Valeu,

Willian


Responder

Gostei + 0

03/07/2009

.lg.

Claro.

Um exemplo bom, é quando vc tenta connectar num banco onde ele não existe ou foi reiniciado. O Delphi gera a Exceção [b:c097044510]EOleException[/b:c097044510]

Faça o teste você mesmo.
Primeiro tenha certeza que o delphi lhe mostrará a exceção na tela indo em:
[b:c097044510]Tools[/b:c097044510], [b:c097044510]Debugger Options[/b:c097044510], [b:c097044510]Language Exceptions[/b:c097044510] (aba)
verifique se está marcado a opção [b:c097044510]Stop on Delphi Exceptions[/b:c097044510] (checkbox)

Essa configuração se aplica ao [color=blue:c097044510]D7[/color:c097044510]. não vi nos demais.

Voltando...
Faça uma connection string que aponte para um servidor que não existe.
Então ative-o. Irá buscar a exceção [color=darkred:c097044510]EOleException[/color:c097044510]

Qualquer coisa, basta postar, que ajudarei dentro de minhas condições. :roll:

Abraços,
.LG.


Responder

Gostei + 0

03/07/2009

.lg.

Me esqueci de colocar:
Basta forçar qual tipo de mensagem que você quer que apareça na exceção, e ela lhe mostrará qual classe pertence.

Use a [b:b7972f19f4]Exception[/b:b7972f19f4] para saber. É o pai de todas as exceções.
Try
  //codigo forçando o erro...
except
  on E: Exception do
    ShowMessage(E.Message);
end;

Com isso você saberá qual classe ele dará exceção. No caso acima usei o [b:b7972f19f4]ADOConnection[/b:b7972f19f4] para conectar em um servidor MSSQL que não existe.

Boa sorte.
.LG.


Responder

Gostei + 0

03/07/2009

Willian

LEGAL!

Vou testar no fim de semana. Valeu!


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar