
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.
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.
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).
DataTypeCompatibility=80 na connection stringPara 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.
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=80instrui o provedor a expor os tipos de dados como se fosse o SQL Server 2000, o que permite que o ADO interprete corretamente os tiposXMLeUDT.
Com isso, você não precisa alterar suas queries, e os campos XML devem aparecer corretamente mapeados no Delphi.
| 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 |
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);
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
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.
Aprenda como usar a função SUBSTRING no SQL Server com exemplos práticos para extrair partes de uma string em suas consultas SQL.
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!
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 […]
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 […]
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 […]
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. […]
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 […]
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 […]
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 […]