LINQ to SQL: Bug no método DataContext.ExecuteCommand

 
A classe DataContext, elemento central do mapeamento OO/Relacional fornecido pelo LINQ to SQL, permite especificar quais os comandos SQL a utilizar nas operações insert,delete e update das várias entidades nele presentes, através de métodos parciais. Na definição do método parcial, o mais comum será invocar o método ExecuteCommand definido na classe DataContext. Este método permite executar um comando SQL sobre a BD correspondente, e tem a seguinte assinatura:
public int ExecuteCommand(
	string command,
	Object[] parameters     [params]
)
A ideia é evitar que o programador tenha de criar os elementos ADO.NET necessário para executar o comando (SqlCommand, SqlParameters, SqlConnection,…). A forma de utilização segue uma abordagem semelhante ao String.Format, por exemplo: os parâmetros são indicados com {n}, onde n é o número de ordem do parâmetro no array de objectos passado.
ExecuteCommand("update Cliente set email = {0} where numCliente = {1}", 
"cliente[at]loja.pt", 12345);
O cenário onde tive de utilizar este método envolvia alguns parâmetros a null. Ora, na documentação (MSDN) lê-se:
If any one of the parameters is null, it is converted to DBNull.Value
Mas, ao executar o método, obtive a seguinte excepção:
"NotSupportedException": A query parameter cannot be of the type System.Object.
Cannot be Object?! O problema só poderia vir dos "nulls" e não foi resolvido com conversão explícita para um tipo qualquer que não object. Depois de alguma pesquisa encontrei esta referência, que diz que se trata de um bug do método, que não aceita parâmetros a null. Como não encontrei muitas referências ao assunto, resolvi deixar aqui uma nota sobre isso. Existem duas soluções "rápidas": a primeira é voltar ao ADO.NET; a outra, é criar um procedimento armazenado que faça o comando e adicioná-lo ao DataContext, que o disponibilizará como um método vulgar.
 
 
Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s