Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Olá, leitores! Como participo de fóruns sobre programação, tenho notado que muitos desenvolvedores tem algumas
dúvidas relacionadas ao componente Query do Delphi. Este componente, de extrema utilidade, dispõe de recursos
para inserir, atualizar, excluir registros e selecionar dados de uma tabela. O foco deste artigo é apresentar os
conceitos básicos e as principais funcionalidades do componente Query, bem como algumas dicas para tirar proveito
deste componente.
“Query”, em inglês, significa pergunta, questão ou dúvida. Nos conceitos de programação, quando executamos
algum comando no banco de dados, esperamos que ele retorne os resultados desejados. Portanto, um comando SQL
pode ser comparado a uma “questão” direcionada ao banco de dados, que por sua vez, fica responsável de retornar
com a resposta. O componente Query tem exatamente essa função: submeter comandos SQL ao banco de dados e
obter o retorno. Não vou entrar em detalhes sobre a linguagem SQL, pressupondo que você, desenvolvedor, já tenha
uma noção dos comandos para manipulação de dados.
Após essa configuração, já podemos escrever a instrução SQL que será executada no banco de dados. Vale lembrar
que o foco deste artigo trata a atribuição de comandos via código, e não de modo gráfico. Portanto, em breve
também vou postar um pequeno tutorial de como utilizar a Query como fonte de dados e exibir os registros em uma
DBGrid.
http://www.andrecelestino.com/conhecendo-o-componente-query/ 1/4
21/08/2018 [Delphi] Conhecendo o componente Query - André Celestino
Query1.Open;
Simples, não?
Ok, já que agora eu selecionei o cliente nº 10 no banco de dados, como podemos obter os dados dele utilizando as
funções da Query? Não existe segredo, basta utilizar o método FieldByName:
ShowMessage('Nome....:' + Query1.FieldByName('Nome').AsString);
ShowMessage('Idade...:' + Query1.FieldByName('Idade').AsString);
ShowMessage('Endereço:' + Query1.FieldByName('Nome').AsString);
Os dados serão retornados, mas a coluna não terá nenhum nome. Sendo assim, não será possível acessar essa
informação pelo FieldByName da Query. Bom, para este problema temos duas soluções. A primeira é renomear a
coluna com o resultado da agregação na própria SQL:
A segunda opção é utilizar outra propriedade da Query, chamada Fields. Essa propriedade enumera os campos
retornados em ordem crescente, permitindo que o desenvolvedor acesse os dados através da posição do campo na
Query:
Neste caso, o campo número zero é a quantidade de clientes retornada pela Query. Da mesma forma, posso acessar
qualquer campo da Query através da posição que ele se encontra:
ShowMessage('Nome....:' + Query1.Fields[0].AsString);
ShowMessage('Idade...:' + Query1.Fields[1].AsString);
ShowMessage('Endereço:' + Query1.Fields[2].AsString);
Porém, ao se utilizar o Fields, o desenvolvedor pode se perder em meio a tantos campos retornados. Por exemplo, se
a consulta retornou 15 campos, como o desenvolvedor irá saber que o campo Telefone é o de número 7? Pensando
assim, eu recomendo utilizar o FieldByName e referenciar os campos pelo próprio nome. Além de facilitar a
manutenção, o código-fonte fica mais legível.
http://www.andrecelestino.com/conhecendo-o-componente-query/ 2/4
21/08/2018 [Delphi] Conhecendo o componente Query - André Celestino
todos os clientes da tabela e preencher uma ListBox com o nome de cada um. É possível programar isso com a
Query?
Yes! Para isso, vamos mudar um pouco a nossa instrução SQL:
Pronto, agora selecionei todos os registros da tabela Clientes. Para que eu possa preencher uma ListBox com os
nomes, será necessário executar um loop (laço de repetição) nos resultados da Query.
Observe como é bem simples. A instrução abaixo move o cursor da Query para o primeiro registro:
Query1.First;
O loop acima assume que enquanto a Query não chegar até o último registro (Eof – End of File), ele será executado.
Dessa forma, poderemos obter o nome de cada cliente e adicionar na ListBox com o código abaixo:
ListBox1.Items.Add(Query1.FieldByName('Nome').AsString);
Por fim, porém o mais importante, temos que mover o cursor da Query para o próximo registro:
Query1.Next;
Query1.Close;
http://www.andrecelestino.com/conhecendo-o-componente-query/ 3/4
21/08/2018 [Delphi] Conhecendo o componente Query - André Celestino
Pronto, nosso novo registro foi incluído! Embora seja bem simples, náo podemos descartar a possibilidade de
ocorrer algum erro na execução da instrução SQL. Caso algum dado esteja inconsistente, a instrução não será
realizada com sucesso. Para prevenir essa possibilidade, nada melhor do que envolver as instruções da Query dentro
de um tratamento de exceções:
Aliás, o tratamento de exceções nunca deixou de ser uma ótima prática de programação. Antes de ir embora, quero
apenas ressaltar uma observação que às vezes confunde alguns desenvolvedores:
• Para comandos SELECT, utilize o comando Open da Query.
• Para comandos INSERT, UPDATE e DELETE, utilize o comando ExecSQL.
http://www.andrecelestino.com/conhecendo-o-componente-query/ 4/4