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.
http://joaoseixas.blogspot.com