Conexões OLE DB e ODBC não permitem a captura de metadados no Assistente de CRUD

Visão geral

Um dos recursos presentes na plataforma Latromi é a possibilidade de criar conexões com diversos bancos de dados, utilizando diferentes tipos de drivers para estabelecer a comunicação. Essas conexões são amplamente utilizadas em vários pontos da plataforma, como na criação de formulários, consultas, browsers, entre outros.

Entre os recursos que fazem uso dessas conexões está o Assistente de CRUD. Ele utiliza a comunicação com o banco de dados para acelerar a criação de objetos, capturando principalmente informações estruturais das tabelas. Dessa forma, o desenvolvedor pode focar na organização dos dados que deseja utilizar, enquanto o assistente facilita a geração dos objetos dentro da plataforma.

Problema

Foi identificado que conexões que utilizam os drivers OLE DB e ODBC não conseguem retornar corretamente as informações de estrutura de tabela no Assistente de CRUD.
Ao tentar consultar a estrutura por meio desses drivers, a seguinte mensagem de erro pode ser exibida (exemplo para uma conexão ODBC configurada para SQL Server):

ERROR [42000] [Microsoft][ODBC SQL Server Driver][SQL Server] Must declare the scalar variable “@table

Esse erro ocorre porque o driver ODBC não oferece suporte a comandos SQL dinâmicos com parâmetros nomeados, como o parâmetro @table mencionado na mensagem.
Como consequência, o Assistente de CRUD não consegue obter a estrutura da tabela por meio desse tipo de conexão.

Simulando

  1. Crie uma conexão usando a opção ODBC/OLE DB.
  2. Abra o Assistente de CRUD.
  3. Selecione a conexão criada nos passos anteriores
  4. Selecione uma tabela.

Solução

É necessário modificar as classes padrões, no core, do projeto para se adaptar ao drive, para isso pode ser usado uma das seguintes abordagem (ou as duas):

  • Modificar a classe DefaultSchemaProvider para efetuar uma interpolação de string, ao invés de usar os parâmetros nomeados. (obs.: Nessa opção como passo extra, é necessário efetuar uma higienização do valor, antes de aplicar a interpolação)
  • Modificar o factory para ter uma opção a mais de construção, que identifique quando é um conexão ODBC/OLE DB, ou seja, quando não é possível a utilização dos parâmetros nomeados.