Você está aqui: Delphi ::: dbExpress ::: TSQLMonitor

Entenda e aprenda a usar a classe TSQLMonitor em suas aplicações Delphi + dbExpress

Quantidade de visualizações: 11433 vezes
Um objeto da classe TSQLMonitor permite interceptar as mensagens que são trocadas entre um componente de conexão SQL (TSQLConnection) e um servidor de banco de dados e salvá-las em uma lista de strings. Veja sua posição na hierarquia de classes do Delphi:

System.TObject
  Classes.TPersistent
    Classes.TComponent
      SqlExpr.TSQLMonitor
Esta classe também implementa as interfaces Classes.IInterfaceComponentReference e System.IInterface.

Usamos um componente TSQLMonitor quando queremos depurar (debug) a comunicação entre nossas aplicações e um servidor de banco de dados. Cada instância da classe TSQLMonitor registra (log) os comandos SQL de um determinado componente de conexão SQL, e os adiciona a uma lista de strings (string list). Isso não só nos permite verificar os comandos que disparamos explicitamente a um dataset SQL ou componente de conexão SQL mas também ver quaisquer comandos disparados nos bastidores, tais como aqueles gerados por um componente dataset provider.

A lista de comandos já registrados pode ser visualizada por meio da propriedade TraceList. Esta propriedade é atualizada automaticamente quando o componente de conexão passa uma mensagem para o servidor de banco de dados.

Siga os passos abaixo para aprender a conectar um controle TSQLMonitor a um componente TSQLConnection e registrar em um TMemo as mensagens trocadas com o servidor de banco de dados:

a) Vá na aba dbExpress e arraste um controle TSQLMonitor para o formulário ou data module;

b) Ajuste a propriedade SQLConnection do TSQLMonitor para o controle TSQLConnection desejado;

c) Ajuste a propriedade Active do TSQLMonitor para True;

d) Coloque o código abaixo no evento OnLogTrace do SQLMonitor (pode ser necessário acrescentar a unit DBXCommon na sua lista de uses):

----------------------------------------------------------------------
Se precisar de ajuda com o código abaixo, pode me chamar
no WhatsApp +55 (62) 98553-6711 (Osmar)
----------------------------------------------------------------------

procedure TForm3.SQLMonitor1LogTrace(Sender: TObject; TraceInfo: TDBXTraceInfo);
begin
  // vamos transferir para um TMemo as mensagens trocadas
  // entre o SQLConnection e o banco de dados
  Memo1.Lines := TStrings(SQLMonitor1.TraceList);
end;

Neste trecho de código eu direcionei o log das mensagens para um TMemo. Note que fiz uma conversão forçada (cast) para o tipo TStrings afim de evitar o erro:

Incompatible types: 'TStrings' and 'TWideStrings'

Veja parte do conteúdo das mensagens registradas pelo SQLMonitor:

select * from `livros`
MySQL - mysql_real_query
MySQL - mysql_field_count
MySQL - mysql_store_result
MySQL - mysql_fetch_field
MySQL - mysql_escape_string
MySQL - mysql_escape_string
SELECT TABLE_SCHEMA, CAST(NULL AS CHAR(1)), TABLE_NAME, 
INDEX_NAME, CASE WHEN NON_UNIQUE = 0 THEN INDEX_NAME ELSE 
NULL END, INDEX_NAME='PRIMARY', NON_UNIQUE=0, 1=1 FROM 
INFORMATION_SCHEMA.STATISTICS WHERE (TABLE_SCHEMA = 'estudos' 
OR (1=2)) AND (1=1 OR 1=2) AND (TABLE_NAME = 'livros' OR (1=2)) 
GROUP BY 1, 2, 3 ,4 ORDER BY 1, 2, 3, 4
MySQL - mysql_real_query
MySQL - mysql_field_count
MySQL - mysql_store_result
MySQL - mysql_fetch_field
MySQL - mysql_fetch_row
MySQL - mysql_fetch_lengths
MySQL - mysql_escape_string
MySQL - mysql_escape_string
MySQL - mysql_escape_string
SELECT TABLE_SCHEMA, CAST(NULL AS CHAR(1)), TABLE_NAME, 
INDEX_NAME, COLUMN_NAME, SEQ_IN_INDEX, COLLATION='A' FROM 
INFORMATION_SCHEMA.STATISTICS WHERE (TABLE_SCHEMA = 'estudos' 
OR (1=2)) AND (1=1 OR 1=2) AND (TABLE_NAME = 'livros' OR (1=2)) 
AND (INDEX_NAME = 'A' OR (1=1)) ORDER BY 1, 2, 3, 4, SEQ_IN_INDEX
MySQL - mysql_real_query
MySQL - mysql_field_count
MySQL - mysql_store_result
MySQL - mysql_fetch_field
MySQL - mysql_fetch_row
MySQL - mysql_fetch_lengths
MySQL - mysql_fetch_row
MySQL - mysql_free_result
select * from `livros`
MySQL - mysql_real_query
MySQL - mysql_field_count
MySQL - mysql_store_result
MySQL - mysql_fetch_field
MySQL - mysql_fetch_row
MySQL - mysql_fetch_lengths
É importante observar que o SQLMonitor usa a propriedade TraceCallbackEvent do componente SQL connection cujas mensagens o mesmo monitora. Se atribuirmos nossa própria chamada callback a esta propriedade, a instância do SQL monitor interromperá seu funcionamento.

Esta dica foi escrita e testada no Delphi 2009.

Link para compartilhar na Internet ou com seus amigos:

Delphi ::: Dicas & Truques ::: Arquivos e Diretórios

Como listar todos os arquivos de um diretório usando Delphi

Quantidade de visualizações: 1642 vezes
Como listar todos os arquivos de um diretório usando Delphi

Em algumas situações precisamos listar todos os arquivos contidos em um determinado diretório. Para isso podemos usar a função abaixo. Esta função recebe o caminho e nome de um diretório e uma coleção de strings TStrings. Como resultado de sua execução, a função insere em TStrings todos os nomes dos diretórios encontrados. Para facilitar o entendimento do exemplo eu incluí uma chamada à função a partir do evento Click de um botão. Tenha a certeza de colocar uma TListBox no formulário antes de executar o código:

----------------------------------------------------------------------
Se precisar de ajuda com o código abaixo, pode me chamar
no WhatsApp +55 (62) 98553-6711 (Osmar)
----------------------------------------------------------------------

procedure listarArquivosDir(diretorio: string; lista: TStrings);
var
  search_rec: TSearchRec;
begin
  if FindFirst(diretorio + '*.*', faAnyFile, search_rec) = 0 then
    begin
      repeat
        if search_rec.Attr <> faDirectory then
          lista.Add(search_rec.Name);
      until FindNext(search_rec) <> 0;

      FindClose(search_rec);
    end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  listarArquivosDir('c:\', ListBox1.Items);
end;

Para fins de compatibilidade, esta dica foi escrita usando Delphi 2009.


Delphi ::: Dicas & Truques ::: Data e Hora

Delphi para iniciantes - Como criar uma data e hora em Delphi usando a função EncodeDateTime()

Quantidade de visualizações: 20478 vezes
Em algumas situações precisamos contruir uma determinada data e hora e retornar um TDateTime. Isso pode ser feito com o auxílio da função EncodeDateTime(). Esta função requer valores inteiros representando o ano, mês, dia, horas, minutos, segundos e milisegundos.

Veja um exemplo no qual construímos a data 22/10/2009:


----------------------------------------------------------------------
Se precisar de ajuda com o código abaixo, pode me chamar
no WhatsApp +55 (62) 98553-6711 (Osmar)
----------------------------------------------------------------------

procedure TForm1.Button1Click(Sender: TObject);
var
  data_hora: TDateTime;
begin
  // não esqueça de incluir DateUtils no uses

  // vamos construir a data 22/10/2009
  data_hora := EncodeDateTime(2009, 10, 22, 0, 0, 0, 0);

  // vamos exibir o resultado
  ShowMessage('A data é: ' + DateTimeToStr(data_hora));
end;

Note que deixamos os valores de horas, minutos, segundos e milisegundos como 0. Experimente construir a mesma data fornecendo também os valores de horas, minutos, segundos e milisegundos. Há, contudo, alguns cuidados a serem tomados. Os valores fornecidos para a função EncodeDateTime() devem obedecer as regras de limites mínimos e máximos:

a) O valor do ano deve estar entre 1 e 9999;

b) Os valores de meses devem estar entre 1 e 12 (incluindo);

c) Os valores válidos para os dias variam de 1 até 28, 29, 30 ou 31, dependendo do valor do mês. Por exemplo, os valores possíveis para o mês 2 (fevereiro) são de 1 até 28 ou até 29, dependendo ou não se o valor do ano especificado for um ano bissexto;

d) Valores para a hora devem estar entre 0 e 24. Se a hora for definida como 24, os valores dos minutos, segundos e milisegundos deverão ser 0, e o TDateTime resultante representará a meia-noite no final do dia especificado e o início do próximo dia;

d) Os valores dos minutos devem variar de 0 até 59;

e) Os valores de segundos devem variar de 0 até 59;

f) Os valores de milisegundos devem variar de 0 até 999.

Se os valores informados para a função EncodeDateTime() estiverem fora destas faixas, uma exceção EConvertError será lançada. Esta exceção ocorrerá em tempo de execução.


Para fins de compatibilidade, esta dica foi escrita usando Delphi 2009.


Delphi ::: Dicas & Truques ::: Trigonometria - Funções Trigonométricas

Como calcular o cateto oposto dadas as medidas da hipotenusa e do cateto adjascente em Delphi

Quantidade de visualizações: 2558 vezes
Todos estamos acostumados com o Teorema de Pitágoras, que diz que "o quadrado da hipotenusa é igual à soma dos quadrados dos catetos". Baseado nessa informação, fica fácil retornar a medida do cateto oposto quando temos as medidas da hipotenusa e do cateto adjascente. Isso, claro, via programação em linguagem Delphi.

Comece observando a imagem a seguir:



Veja que, nessa imagem, eu já coloquei os comprimentos da hipotenusa, do cateto oposto e do cateto adjascente. Para facilitar a conferência dos cálculos, eu coloquei também os ângulos theta (que alguns livros chamam de alfa) e beta já devidamente calculados. A medida da hipotenusa é, sem arredondamentos, 36.056 metros.

Então, sabendo que o quadrado da hipotenusa é igual à soma dos quadrados dos catetos (Teorema de Pitógoras):

\[c^2 = a^2 + b^2\]

Tudo que temos que fazer é mudar a fórmula para:

\[a^2 = c^2 - b^2\]

Veja que agora o quadrado do cateto oposto é igual ao quadrado da hipotenusa menos o quadrado do cateto adjascente. Não se esqueça de que a hipotenusa é o maior lado do triângulo retângulo.

Veja agora como esse cálculo é feito em linguagem Delphi:

----------------------------------------------------------------------
Se precisar de ajuda com o código abaixo, pode me chamar
no WhatsApp +55 (62) 98553-6711 (Osmar)
----------------------------------------------------------------------

procedure TForm2.Button1Click(Sender: TObject);
var
  a, b, c: Real;
begin
  c := 36.056; // medida da hipotenusa
  b := 30; // medida do cateto adjascente

  // agora vamos calcular o comprimento da cateto oposto
  a := sqrt(sqr(c) - sqr(b));

  // e mostramos o resultado
  Edit1.Text := 'A medida do cateto oposto é: ' +
    FloatToStr(a);
end;

Veja que o cálculo é feito a partir do evento Click de um botão Button1 e o resultado é apresentado na propriedade Text de uma caixa de texto Edit1.

Ao executar este código Delphi nós teremos o seguinte resultado:

A medida do cateto oposto é: 20,0008783807112

Como podemos ver, o resultado retornado com o código Delphi confere com os valores da imagem apresentada.


Desafios, Exercícios e Algoritmos Resolvidos de Delphi

Veja mais Dicas e truques de Delphi

Dicas e truques de outras linguagens

Códigos Fonte

Programa de Gestão Financeira Controle de Contas a Pagar e a Receber com Cadastro de Clientes e FornecedoresSoftware de Gestão Financeira com código fonte em PHP, MySQL, Bootstrap, jQuery - Inclui cadastro de clientes, fornecedores e ticket de atendimento
Diga adeus às planilhas do Excel e tenha 100% de controle sobre suas contas a pagar e a receber, gestão de receitas e despesas, cadastro de clientes e fornecedores com fotos e histórico de atendimentos. Código fonte completo e funcional, com instruções para instalação e configuração do banco de dados MySQL. Fácil de modificar e adicionar novas funcionalidades. Clique aqui e saiba mais
Controle de Estoque completo com código fonte em PHP, MySQL, Bootstrap, jQuery - 100% funcional e fácil de modificar e implementar novas funcionalidadesControle de Estoque completo com código fonte em PHP, MySQL, Bootstrap, jQuery - 100% funcional e fácil de modificar e implementar novas funcionalidades
Tenha o seu próprio sistema de controle de estoque web. com cadastro de produtos, categorias, fornecedores, entradas e saídas de produtos, com relatórios por data, margem de lucro e muito mais. Código simples e fácil de modificar. Acompanha instruções para instalação e criação do banco de dados MySQL. Clique aqui e saiba mais

Linguagens Mais Populares

1º lugar: Java
2º lugar: Python
3º lugar: C#
4º lugar: PHP
5º lugar: C
6º lugar: Delphi
7º lugar: JavaScript
8º lugar: C++
9º lugar: VB.NET
10º lugar: Ruby



© 2025 Arquivo de Códigos - Todos os direitos reservados
Neste momento há 87 usuários muito felizes estudando em nosso site.