Fórum Exemplo de função para execução rápida de código SQL #371795
01/07/2009
0
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
Curtir tópico
+ 0Posts
02/07/2009
.lg.
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.
Gostei + 0
02/07/2009
Willian
Vou tentar aplicá-las nesse fim de semana.
Gostei + 0
02/07/2009
Willian
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
Gostei + 0
03/07/2009
.lg.
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.
Gostei + 0
03/07/2009
.lg.
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.
Gostei + 0
03/07/2009
Willian
Vou testar no fim de semana. Valeu!
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)