Data Tables – Parte IV

Verificando se uma determinada coluna existe em um objeto DataTable

É muito comum ao se trabalhar com projetos comerciais que fazem uso de banco de dados, termos várias versões de tabelas sendo usada ao mesmo tempo.

Por exemplo, você possui uma aplicação que é usada por vários clientes. Eventualmente você altera a estrutura do seu banco de dados.

Normalmente você vai enviar scripts para fazer update da estrutura das tabelas do banco de dados, entretanto, eventualmente, por vários motivos, estes scripts podem não ser executados, falhando em atualizar a estrutura da tabela.

Considerando uma situação destas, se você tiver uma operação com a tabela e fizer referência para uma coluna que não exista, isto irá causar um erro.

Por exemplo, a tabela do primeiro post. Vamos tentar acrescentar dados para uma coluna chamada “Preco” que ainda não existe:

    1 DataTable TabelaDeExemplo = new DataTable("instrumentos");

    2 

    3 TabelaDeExemplo.Columns.Add(

    4     new DataColumn

    5     {

    6         ColumnName = "IdInstrumento",

    7         DataType = typeof( System.Int32 ),

    8         AutoIncrement = true,

    9         AutoIncrementSeed = 1,

   10         AutoIncrementStep = 1

   11     });

   12 

   13 TabelaDeExemplo.Columns.Add( new DataColumn( "Tipo", typeof( System.String ) ) );

   14 TabelaDeExemplo.Columns.Add( new DataColumn( "Marca", typeof( System.String ) ) );

   15 TabelaDeExemplo.Columns.Add( new DataColumn( "Modelo", typeof( System.String ) ) );

   16 TabelaDeExemplo.Columns.Add( new DataColumn( "AnoDeFabricacao", typeof( System.String ) ) );

   17 

   18 // acrescentar registros

   19 DataRow registro = TabelaDeExemplo.NewRow();

   20 registro["Tipo"] = "Violão";

   21 registro["Marca"] = "Taylor";

   22 registro["Modelo"] = "A123";

   23 registro["AnoDeFabricacao"] = 2000;

   24 registro["Preco"] = 7000;

   25 TabelaDeExemplo.Rows.Add( registro );

Se você executar este código você terá uma “ArgumentException” com a mensagem de que a coluna “Preço” não pertence à tabela “instrumentos”.

Uma maneira de evitar isto é com o método “Contains” vinculado com a propriedade “Columns” do objeto “DataTable”. Você altera o código para somente incluir um valor para a coluna preço caso exista a coluna na tabela. O código de inclusão, alterado, deve ficar parecido com o seguinte:

   18 // acrescentar registros

   19 DataRow registro = TabelaDeExemplo.NewRow();

   20 registro["Tipo"] = "Violão";

   21 registro["Marca"] = "Taylor";

   22 registro["Modelo"] = "A123";

   23 registro["AnoDeFabricacao"] = 2000;

   24 

   25 if ( TabelaDeExemplo.Columns.Contains( "preco" ) )

   26 {

   27     registro["Preco"] = 7000;

   28 }

   29 

   30 TabelaDeExemplo.Rows.Add( registro );

Lembrando de que embora a linguagem C# seja “CaseSensitive”, a verificação das colunas não é.

Considerações

Mesmo um bom projeto de banco de dados em um sistema comercial sofre alterações durante o seu ciclo de vida.

A medida apresentada serve apenas como uma forma de se contornar eventuais problemas com atualizações de estruturas dos bancos de dados.

Nada substitui uma arquitetura de atualização de banco de dados robusta e bem executada. Isso é conseguido basicamente testando os scripts para alteração das tabelas no maior número de cenários possível, incluindo aqueles em que o script não seria executado.