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ãesO 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.cs1: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:}
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!