Desenvolvimento - ADO.NET

ADO.NET 2.0 - Copiando dados usando Bulk Copy

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.

por Ramon Durães



.csharpcode, .csharpcode pre { font-size: small; color: black; font-family: Consolas, "Courier New", Courier, Monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; } .style1 { font-family: Verdana; font-size: x-small; }
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 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 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 exemplo

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


Figura 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. Conforma 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!
Ramon Durães

Ramon Durães - Especialista em desenvolvimento de software e Microsoft Most Valuable Professional (MVP) em Visual Studio Team System. Realiza treinamentos de .NET Framework em empresas, consultoria em arquitetura de software e implantação de Visual Studio Team System. Palestrante nos principais eventos da Microsoft no Brasil (Tech-Ed 2005, Tech-Ed 2006, Tech-Ed 2007, Tech-Ed 2008, Tech-ED 2009), Microsoft Innovation Days 2007 (Salvador, Brasília, Recife, Goiânia, Natal, Maringá), Microsoft Innovation Days 2009 (Salvador) , Campus Party Brasil 2009 e eventos regionais relacionados a grupos de usuários e universidades. Conhecido autor de artigos para os principais portais de conteúdo e autor de 10 publicações eletrônicas em CD (Video-Aula) pela editora Linha de Código além dos livros "Desenvolvendo para web usando o Visual Studio 2008" e "Gerenciando projetos de software usando Visual Studio Team System" pela editora Brasport. Pode ser encontrado em seu blog http://www.ramonduraes.net e @ramonduraes no Twitter.