quinta-feira, 1 de maio de 2008

Tutorial: Transferindo dados em massa para o SQL Server

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!!! : )

Nenhum comentário: