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. 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!







