Delphi + SQL Server: Como resolver o problema de campos XML via ADO

Delphi e SQLServer via ADO

 

Ao integrar Delphi com SQL Server utilizando ADO, um problema bastante comum pode surgir: campos do tipo XML não são mapeados corretamente, aparecendo como ftUnknown ou inacessíveis no TADOQuery. Isso acontece mesmo que o campo esteja presente na consulta SQL.

Mas fique tranquilo: existem duas soluções eficazes para resolver esse problema, e você pode escolher a que melhor se adapta ao seu cenário.

 

🧩 Por que isso acontece?

O tipo XML foi introduzido no SQL Server 2005 e não é tratado adequadamente por padrão através do provedor ADO, mesmo com o SQL Native Client (SQLNCLI). O Delphi, utilizando ADO, espera tipos compatíveis com versões anteriores, como varchar, nvarchar, etc.

Segundo documentação oficial da Microsoft, os novos tipos como XML e UDT só são corretamente expostos ao ADO se o parâmetro DataTypeCompatibility estiver corretamente configurado na connection string.

 

✅ Solução 1: Converter o campo XML diretamente na consulta

A maneira mais direta de contornar o problema é converter o campo XML para texto no próprio SQL, usando CONVERT ou CAST. Isso garante compatibilidade imediata com os componentes ADO no Delphi.

SELECT 
  Id,
  Nome,
  CONVERT(varchar(MAX), DadosXml) AS DadosXml
FROM Clientes

No Delphi, o campo DadosXml será tratado como ftMemo, o que permite seu uso normal com FieldByName('DadosXml').AsString.

Essa solução é especialmente útil se você não puder alterar a connection string (como em projetos legados ou restrições de TI).

 

✅ Solução 2: Usar DataTypeCompatibility=80 na connection string

Para quem deseja uma solução mais técnica e robusta, é possível ajustar a connection string do ADO para que o provedor SQL Native Client expose os tipos XML e UDT de forma compatível com o ADO.

 

Como fazer:

Use o provedor SQL Native Client 11 (SQLNCLI11) e adicione a propriedade DataTypeCompatibility=80:

Provider=SQLNCLI11;
Data Source=SERVIDOR\INSTANCIA;
Initial Catalog=SeuBanco;
User ID=usuario;
Password=senha;
DataTypeCompatibility=80;

🔍 A propriedade DataTypeCompatibility=80 instrui o provedor a expor os tipos de dados como se fosse o SQL Server 2000, o que permite que o ADO interprete corretamente os tipos XML e UDT.

Com isso, você não precisa alterar suas queries, e os campos XML devem aparecer corretamente mapeados no Delphi.

 

🧪 Qual solução escolher?

Situação Solução recomendada
Você pode alterar a consulta SQL ✅ Solução 1 (CONVERT)
Você prefere não alterar a SQL ou precisa de compatibilidade geral ✅ Solução 2 (DataTypeCompatibility)
Você quer garantir compatibilidade com tipos UDT também ✅ Solução 2

 

✍️ Exemplo em Delphi

ADOConnection1.ConnectionString :=
  'Provider=SQLNCLI11;' +
  'Data Source=SERVIDOR\SQL2019;' +
  'Initial Catalog=MeuBanco;' +
  'User ID=usuario;Password=senha;' +
  'DataTypeCompatibility=80;';

ADOQuery1.SQL.Text := 'SELECT Id, Nome, DadosXml FROM Clientes';
ADOQuery1.Open;
ShowMessage(ADOQuery1.FieldByName('DadosXml').AsString);

 

🔚 Conclusão

Se você utiliza Delphi com ADO e precisa acessar campos do tipo XML no SQL Server, agora tem duas formas confiáveis de resolver o problema:

  • Converter o campo XML para texto (varchar(max)) na SQL;

  • Ou configurar a connection string com DataTypeCompatibility=80 e usar o SQLNCLI11.

Ambas são soluções testadas e eficazes. Escolha a que melhor se encaixa no seu projeto!

 
 

🚀 Gostou da dica?

Deixe seu comentário abaixo com sua experiência ou dúvida!
🔁 Compartilhe este post com outros desenvolvedores que usam Delphi + SQL Server, pode ajudar muita gente!

 
 

💬 Vamos trocar ideias!

#Delphi #SQLServer #ADO #XML

#DevTips #Programação #Desenvolvimento

#GiovaniDaCruz

 

  • Publicado por Giovani Da Cruz
  • 0 comentarios
  • 10 de maio de 2025

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Posts Relacionados a Categoria Banco de Dados

Continue aprendendo

Aumente o seu conhecimento
Como deixar a primeira letra de cada palavra em maiúsculo no Firebird (Title Case)

Quer deixar suas descrições no Firebird com a primeira letra de cada palavra em maiúsculo? Veja como criar uma função interna (Internal Function) compatível com o Firebird 5 que formata textos automaticamente, incluindo suporte a acentuação e caracteres especiais.

21 de outubro de 2025
Como Usar a Função SUBSTRING no SQL Server

Aprenda como usar a função SUBSTRING no SQL Server com exemplos práticos para extrair partes de uma string em suas consultas SQL.

25 de maio de 2025
Como Calcular a Idade no SQL usando Firebird

Aprenda a calcular a idade diretamente no Firebird SQL com uma query simples e eficiente. Ideal para sistemas que armazenam datas de nascimento, como CRMs, ERPs, escolas e clínicas. Evite lógicas na aplicação e melhore a performance com essa dica prática!

12 de maio de 2025
Wildcards em SQL: Explorando o Poder das Consultas Dinâmicas

  Principais Wildcards no SQL % – Representa zero ou mais caracteres. Uso comum: Localizar palavras que começam, terminam ou contêm determinado texto.   _ – Representa exatamente um caractere. Uso comum: Busca por palavras que seguem um padrão específico de comprimento.   [ ] – Define um conjunto de caracteres permitidos. Uso comum: Busca […]

13 de janeiro de 2025
O que é SQL Injection e Como Proteger Seu Sistema

  SQL Injection é uma das vulnerabilidades mais comuns e perigosas em aplicações web que utilizam bancos de dados. Essa técnica de ataque permite que um invasor insira comandos SQL maliciosos em campos de entrada de dados de uma aplicação, explorando falhas na validação ou sanitização das informações antes que sejam processadas no banco de […]

11 de janeiro de 2025
Introdução ao NoSQL: Explorando o MongoDB

  NoSQL é uma categoria de bancos de dados que se destaca por sua flexibilidade e escalabilidade, tornando-se uma alternativa poderosa aos tradicionais bancos de dados relacionais. Um dos mais populares entre os bancos NoSQL é o MongoDB, conhecido por sua simplicidade e desempenho em aplicações modernas.   O que é NoSQL? NoSQL significa “Not […]

2 de janeiro de 2025
O que é Soft Delete e como ele pode ser útil no seu banco de dados

  No desenvolvimento de sistemas, a exclusão de registros de banco de dados é uma tarefa comum. No entanto, existem cenários em que, por razões de auditoria, recuperação de dados ou até mesmo por precaução, você pode não querer excluir fisicamente os dados de uma tabela. É aí que entra o conceito de soft delete. […]

27 de dezembro de 2024
Usando CTEs para Consultas Mais Limpas no SQL

  Common Table Expressions (CTEs) são uma poderosa funcionalidade do SQL que permite simplificar consultas complexas, dividindo-as em componentes modulares e reutilizáveis. Isso melhora a legibilidade e a manutenção das consultas, tornando o código mais organizado. As CTEs são definidas com a palavra-chave WITH e podem ser referenciadas várias vezes dentro da consulta principal. Neste […]

26 de dezembro de 2024
Como Calcular o Dia do Ano em Firebird Usando SQL

  O banco de dados Firebird oferece uma forma poderosa de manipular datas e realizar cálculos diretamente no SQL. Entre as funcionalidades disponíveis, calcular o dia do ano de uma data é algo que pode ser feito utilizando a função EXTRACT. Neste artigo, explicaremos como isso funciona, mostraremos exemplos práticos e discutiremos ajustes necessários para […]

4 de dezembro de 2024
5 Dicas Essenciais para Elaborar um Banco de Dados Eficiente

  Criar um banco de dados eficiente é uma etapa crucial para o sucesso de qualquer sistema. Além de garantir desempenho e escalabilidade, um banco bem projetado facilita a manutenção e evita problemas futuros. Confira as 5 dicas essenciais para garantir um banco de dados eficiente:   1. Entenda a Necessidade do Usuário Final O […]

10 de novembro de 2024

Publicidade

Redes Sociais

Receba as Novidades

Loading