Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Lucas_Santos

Comparar Data Table

Recommended Posts

Quero fazer uma espécie de replicação de dados via C#,

 

Os dados que estão em uma tabela de um banco de dados no Servidor 1, deverão ser replicados no Servidor 2. Caso haja alguma inclusão na tabela do banco de dados presente no Servidor 1, o Servidor 2 apenas fará a inclusão da mesma linha, ou seja, não pegará todos os registros novamente, apenas os novos que foram incluidos.

 

O que estou fazendo é, uma consulta na tabela do Servidor 1 e gravando tudo numa Data Table, e faço a mesma consulta na tabela do Servidor 2 e gravo em outra Data Table.

 

Queria saber como fazer para Comparar as 2 Data Tables para ver o que alterou entre uma e outra, e então gravar no Servidor 2 apenas aquelas linha que foram inseridas.

 

Segue abaixo uma ideia que tive, porem nao funciona, mas creio que seja algo proximo a isso

 


namespace Replication
{
   public partial class _Default : System.Web.UI.Page
   {
       DataTable dt = new DataTable();
       DataTable dt2 = new DataTable();

       protected void Page_Load(object sender, EventArgs e)
       {
           preencheGrid();
           preencheDataTableServidorReplicacao();
           insereDados();
           //Compara(dt, dt2);
       }

       public void preencheGrid()
       {
           string connectionstring = @"Servidor 1 está aqui";            

           try
           {
               using (SqlConnection conexao = new SqlConnection(connectionstring))
               {
                   conexao.Open();
                   SqlCommand comando = new SqlCommand();

                   comando.CommandText = "meu select";
                   comando.CommandType = CommandType.Text;
                   comando.Connection = conexao;

                   SqlDataAdapter da = new SqlDataAdapter(comando);
                   da.Fill(dt);
               }
           }
           catch (SqlException execao)
           {
               resultado.Text = "Falha!";
               Console.Write(execao.Message);
           }
       }

       public void preencheDataTableServidorReplicacao()
       {
           string connectionstring = @"Servidor 2 está aqui";

           try
           {
               using (SqlConnection conexao = new SqlConnection(connectionstring))
               {
                   conexao.Open();
                   SqlCommand comando = new SqlCommand();

                   comando.CommandText = "minha consulta esta aqui";
                   comando.CommandType = CommandType.Text;
                   comando.Connection = conexao;

                   SqlDataAdapter da = new SqlDataAdapter(comando);
                   da.Fill(dt2);
               }
           }
           catch (SqlException execao)
           {
               resultado.Text = "Falha!";
               Console.Write(execao.Message);
           }
       }

       public void insereDados()
       {
           try
           {
               string con = @"Servidor 2 Está aqui";
               using (SqlBulkCopy sbc = new SqlBulkCopy(con))
               {
                   sbc.DestinationTableName = "San_ConsultaImovel";

                   // Numero de registros que serão gravados.
                   sbc.BatchSize = dt.Rows.Count;

                   for (int i = 0; i < dt.Columns.Count; i++)
                   {
                       sbc.ColumnMappings.Add(dt.Columns[i].ToString(), dt.Columns[i].ToString());
                   }

                   // Grava no servidor.
                   sbc.WriteToServer(dt);
                   resultado.Text = "Sucesso!";
               }
           }
           catch (SqlException exe)
           {
               resultado.Text = "Falha!";
               Console.Write(exe.Message);
           }
       }

       public void Compara(DataTable dt, DataTable dt2)
       {
           int dtCount = dt.Rows.Count;
           int dt2Count = dt2.Rows.Count;

           //Se o numero de linhas não são iguais.
           if (dtCount != dt2Count)
           {
               DataTable dt3 = new DataTable();
               for (int i = 0; i < dt.Rows.Count; i++)
               {
                   if (dt.Rows[i].ItemArray.Equals(dt2.Rows[i].ItemArray))
                   {
                       Console.Write("OK");
                   }                    
               }     

               insereDados();
           }            
       }
   }    
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Por que não funciona, o que acontece?

 

Abraços...

 

O problema está no metodo que compara,

 

       public void Compara(DataTable dt, DataTable dt2)
       {
           int dtCount = dt.Rows.Count;
           int dt2Count = dt2.Rows.Count;

           //Se o numero de linhas não são iguais.
           if (dtCount != dt2Count)
           {
               DataTable dt3 = new DataTable();
               for (int i = 0; i < dt.Rows.Count; i++)
               {
                   if (dt.Rows[i].ItemArray.Equals(dt2.Rows[i].ItemArray))
                   {
                       Console.Write("OK");
                   }                    
               }     

               insereDados(dt3);
           }            
       }

 

Irei alterar o metodo de InsereDados, passando como parametro o novo DataTable dt3 que foi criado no metodo compara, mas nao funciona pq no trecho onde eu faço a comparação entre objetos,

if (dt.Rows[i].ItemArray.Equals(dt2.Rows[i].ItemArray))
                   {
                       Console.Write("OK");
                   }   

 

ele sempre dá como se os objetos fossem diferentes!! na qual quando eles sao iguais em grande parte!!

Compartilhar este post


Link para o post
Compartilhar em outros sites

verifique se esses não resolvem:

http://www.dotnetspark.com/kb/705-compare-two-datatables-and-get-result.aspx

http://canlu.blogspot.com/2009/05/how-to-compare-two-datatables-in-adonet.html

 

caso por algum motivo queira continuar no seu código, creio que deva criar chaves primarias no datatable e tentar localizar o registro pela chave para a validação

http://msdn.microsoft.com/pt-br/library/system.data.datatable.primarykey.aspx

http://msdn.microsoft.com/en-us/library/y06xa2h1(v=vs.80).aspx

 

se estiver utilizando sql server 2008, podes utilizar o comando MERGE

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.