terça-feira, 9 de setembro de 2008

Inserindo de arquivos para o banco de dados - Inserção em massa - SQLBULKCOPY

Vamos ao cenario que acontece com frequencia nas atividades de desenvolvedores de back office.

Um arquivo texto ou excel, repleto de informações que precisam ser persistidas no banco, de forma consistente e com uma boa performance.
Isso é muito comun e existem inumeras soluções. Desde soluções diretas no SQL Server por exemplo, a soluções "menos sofisticadas" como ler e inserir linha a linha do arquivo no banco.
Em outra oportunidade irei falar também do Bulk Insert do SQL Server, que tem o uso muito simples, mas tem algumas limitações.
Mas agora, vou falar rapidamente de uma forma "elegante" e muito simples que quebrou um galho muito bom pra mim.
O SqlBulkCopy, que é uma classe que está no namespace System.Data.SqlClient.
Com está classe, basta que você passe um DataTable, faça o mapeamento, indicando qual coluna do DataTable equivale a qual coluna no banco de dados e pronto. Depois disso é só correr pro abraço. Originalmente foi projetado para atuar no SQL Server, não sei se essa classe é capaz de trabalhar com outros bancos.
Um exemplo bem simples segue abaixo:

public void InserirFuncionarios(DataTable tabela)
{
try
{
//Atribuindo a string de conexao ao objeto SqlConnection
SqlConnection con = new SqlConnection(StringConexao);
//Criando o objeto de BulkCopy, passando a conexao
SqlBulkCopy bc = new SqlBulkCopy(con);

//Definindo a tabela destino no banco de dados
bc.DestinationTableName = "Funcionario";
//Criando o Mapeamento de colunas do DataTable para o banco
SqlBulkCopyColumnMappingCollection cols = bc.ColumnMappings;
//Percorrendo as colunas da tabela e associando as colunas da tabela do banco
//Isso só é possivel porque as colunas da tabela tem o mesmo nome das colunas do banco
//Assim a DestinationComlumn deve receber o nome da coluna do banco
//E a sourceColumn deve receber o nome da coluna da tabela
foreach (DataColumn coluna in tabela.Columns)
{
SqlBulkCopyColumnMapping c = new SqlBulkCopyColumnMapping();
c.DestinationColumn = coluna.ColumnName;
c.SourceColumn = coluna.ColumnName;
cols.Add(c);
}

//Abrindo a conexão, Escrevendo no banco e fechando a conexão
con.Open();
bc.WriteToServer(tabela);
con.Close();
}
catch (Exception e) {
throw new Exception(e.Message);
}
}

Espero que ajude alguem esse trecho de codigo simples que explica como fazer inserção em bloco no SQL Server utilizando a classe SqlBulkCopy em C#
Se alguem tiver uma forma melhor de fazer com essa classe, fique a vontade de deixar um comentario.

0 comentários:

 
João Bosco Seixas