Dev (Back & Front)ARTIGO

ADO.NET 2.0 – Copiando dados usando Bulk Copy

Artigo recomendado para Visual Studio 2005

O ADO.NET traz, internamente, um recurso muito parecido com o BCP (Bulk Copy Program) do SQL Server para cópia de grandes volumes de informações de um banco de dados para outro. A depender do volume, se não for implementado corretamente, possivelmente vai ter problemas de desempenho. Em algum momento na implementação de sua solução, provavelmente você necessitará desse recurso como pode observar na figura 01.

Figura 01 - Transferindo grande volume de dadosFigura 01 – Transferindo grande volume de dados

Dentro do ADO.NET 2.0, temos a classe System.Data.SqlClient.SqlBulkCopy que disponibiliza a funcionalidade de Bulk Copy utilizando código .NET . Ela está detalhada na figura 02.

Figura 02 - Classe SqlBulkCopyFigura 02 – Classe SqlBulkCopy

Dentro da classe BulkCopy, iremos utilizar o método WriteToServer, que possui três sobre cargas para utilizarmos como opções na transferência e gravação da informação no destino.

De forma a ter uma melhor compreensão dessa solução, apresentamos na figura 03 uma aplicação de exemplo. Nela, temos dois banco de dados: Origem.mdf e Destino.mdf. Nosso objetivo é mover 10.000 registros da tabela produtos para a tabela produtos final.

Figura 03 - Aplicação de exemploFigura 03 – Aplicação de exemplo

Ainda sobre a aplicação de exemplo, apresentamos uma segunda visão do seu projeto conforme figura 04.

Figura 04 - Visão do projetoFigura 04 – Visão do projeto

Agora chegou o momento tão esperando de criar nosso código para fazer a transferência das informações de uma tabela para outra. Conforme listagem 01, na linha 11 é feito o acesso a primeira tabela e na linha 39 por meio do método WriteToServer(), estamos gravando os dados na segunda tabela. Para tornar esse código mais funcional, estamos utilizando o evento SqlRowsCopiedEventHandler para exibir as linhas copiadas, mas não é necessário sua implementação para fazer a cópia.

CopiaDados.cs

   1:public void Copiar(string SqlConsulta,string TabelaDestino)

   2:  {

   3:  using (SqlConnection conn1 =new SqlConnection(_ConnStringDb1))

   4:           {

   5:                conn1.Open();

   6:                

   7:           /// Adicione código aqui pra fazer select Count(*)

   8:  

   9:   

  10:       SqlCommand cmd1 = new SqlCommand(SqlConsulta, conn1);

  11:       SqlDataReader dr =cmd1.ExecuteReader();

  12:       ///cmd1.CommandTimeout = 500;

  13:                  

  14:   

  15:  using (SqlConnection conn2 =new SqlConnection(_ConnStringDb2))

  16:                {

  17:                    conn2.Open();

  18:                    

  19:                   using (SqlBulkCopy bc=new SqlBulkCopy(conn2))

  20:                    {

  21:                        bc.DestinationTableName =TabelaDestino ;

  22:                        bc.BulkCopyTimeout = 500;

  23:  

  24:                      try

  25:                      {

  26:                      if (_NotificarLinhaCopiada > 0)

  27:                      {

  28:                      bc.NotifyAfter = _NotificarLinhaCopiada;

  29:                     bc.SqlRowsCopied +=

  30:                 new SqlRowsCopiedEventHandler(NotificarLinhas);   

  31:                     } 

  32:                             

  33:                            //Obtendo quantidade de registros

  34:  

  35:   

  36:                       VerificarCopiaFinalizada(TabelaDestino,

  37:                              conn2, StatusCopia.Inicio);

  38:   

  39:                            bc.WriteToServer(dr);

  40:   

  41:                             

  42:                          }

  43:   

  44:                        catch (SqlException ex)

  45:                        {

  46:                           //Exibir erros sql

  47:                    throw new Exception("Falha copiando", ex);

  48:                        }

  49:                        catch (Exception ex)

  50:                        {

  51:                        //Exibir erros gerais

  52:               throw new Exception("Falha geral copiando", ex);

  53:                        }

  54:                          finally

  55:                          {

  56:                              bc.Close();

  57:                              dr.Close();                         

  58:   

  59:                  this.VerificarCopiaFinalizada(TabelaDestino,

  60:                               conn2,StatusCopia.FimCopia);

  61:                              conn1.Close();

  62:                              conn2.Close();

  63:                          }

  64:                      }

  65:   

  66:                  }

  67:              }

  68:   

  69:}
Listagem 01 - Classe Copiardados, método Copiar.

Após observação do código da listagem 01, você conferiu o quanto foi fácil a implementação para fazer a cópia dos dados usando o BulkCopy.

Para informações mais detalhadas você pode obter diretamente no código fonte.

Até próximo artigo! Sucesso!

é diretor executivo na 2PC Brasil. Especialista em desenvolvimento de software focando em Agile Application Lifecycle Management (ALM) com diversas certificações, como Microsoft MVP Visual Studio ALM, Professional Scrum Developer (PSD), Professional Scrum Master (PSM), Certified ScrumMaster (CSM). É autor dos livros “Desenvolvendo para web usando o Visual Studio 2008” e “Gerenciando projetos de software usando Visual Studio Team System” pela editora Brasport. Palestrante nos principais eventos no Brasil, como TechEd (2005-2011) e Campus Party Brasil (2009-2012) além eventos regionais relacionados a grupos de usuários e universidades. Pesquisador de marketing digital, redes sociais, gestão 2.0 e agilidade. Para contatos, @ramonduraes no twitter.

Ver perfil