Microsoft Data Access Application Block for .NET é uma solução que visa facilitar o acesso a dados com ADO.NET. Nos dias atuais ainda podemos encontrar aplicações que utilizam a biblioteca.
Existe um problema com a versão 2.0: ao utilizar parâmetros do tipo Structured, o SQL Server retorna um erro afirmando que não aceita o nome do banco de dados no TypeName do parâmetro.
Isso impossibilita que estruturas de dados sejam passadas pela aplicação ao banco de dados em formato de User Defined Table Type.
// hack to fix a sql server bug in the SqlCommandBuilder.DeriveParameters method // applies to Structured Dbtype private static void FixSqlServerCommandBuilder(SqlParameter[] commandParameters) { foreach (SqlParameter parameter in commandParameters) { if (parameter.SqlDbType != SqlDbType.Structured) { continue; } string name = parameter.TypeName; int index = name.IndexOf("."); if (index == -1) { continue; } name = name.Substring(index + 1); if (name.Contains(".")) { parameter.TypeName = name; } } }
O tratamento do cache de parâmetros deve ser feito nas variáveis discoverdParameters e clonedParameters da classe SQLHelper, como segue:
FixSqlServerCommandBuilder(discoveredParameters); FixSqlServerCommandBuilder(clonedParameters);
Com essas mudanças, o Microsoft Data Access Application Block for .NET versão 2.0 passa a funcionar com User Defined Types do SQL Server.