Objetivo
Você já precisou transferir milhares de linhas de dados de alguma fonte de dados como o Excel para uma tabela no SQL Server?
Bom, se essa é sua necessidade agora, aproveite para usar uma ferramenta do .NET: a classe SQLBulkCopy, do namespace System.Data.SQLClient.
Um exemplo simples
Para exemplificar o uso dessa classe, observe o trecho de código abaixo:
SqlBulkCopy bulkCopy = new SqlBulkCopy(suaConnectionString)
bulkCopy.DestinationTableName = nomeDaTabela;
bulkCopy.BulkCopyTimeout = 10000;
bulkCopy.WriteToServer(seuDataReader);
O trecho acima é bem simples. Você cria uma instância do SqlBulkCopy passando a string de conexão para o banco de dados para o qual seus dados serão copiados.
Depois disso, você define o nome da tabela que irá receber os dados, o tempo máximo que a transferência poderá durar e, por fim, um DataReader contendo os dados a serem transferidos.
Um exemplo completo!
Nada melhor que um exemplo completo para entender como resolver o problema. E, para isso, vamos pegar um caso bastante rasoável: imagine que você tem uma planilha do Excel e precisa transferí-la para o SQL Server (uma decisão bastante sábia!).
Como entrada do nosso método, temos uma string chamada sql que define o SELECT que será feito na planilha do Escel que formará nosso DataReader. O segundo argumento define o nome da tabela para a qual os dados serão copiados.
public void CarregaBD(string sql, string nomeDaTabela)
{
// String para conexão ao arquivo do Excel
string excelConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\dados.xls;Extended Properties=""Excel 8.0;HDR=YES;""";
// Cria a conexão com a planilha
OleDbConnection con = new OleDbConnection(excelConnectionString);
using (con)
{
OleDbCommand cmd = new OleDbCommand(sql, con);
con.Open();
// Cria um DataReader a partir dos dados
DbDataReader dataReader = cmd.ExecuteReader();
using (dataReader)
{
// SQL Server Connection String
string sqlCS =
ConfigurationManager.ConnectionStrings["bdConnectionString"].ConnectionString;
// Essa parte já é familiar, certo?! ;)
SqlBulkCopy bulkCopy = new SqlBulkCopy(sqlCS);
using (bulkCopy)
{
bulkCopy.DestinationTableName = nomeDaTabela;
bulkCopy.BulkCopyTimeout = 10000;
bulkCopy.WriteToServer(dataReader);
}
}
}
}
Bom, espero que você faça bom proveito dessa classe! Por incrível que pareça, esse método tem me sido útil repetidas vezes!!! : )