COMPARAR VALORES EM TABLES

CARLOSRAMIREZ 02/09/2011 10:41:50
#383183
Senhores,

Eu tenho um dataset com várias tables. Eu gostaria de comprar os valores dos campos contidos nestas tables, para me retornar se há valores diferentes ou se são iguais. Por exemplo:
table [Ô]a1[Ô] valores 1,2,3,4
table [Ô]a2[Ô] valores 1,2,4
Neste caso os valores são diferentes, logo, retornaria que as tables são diferentes

Eu gostaria de compara de um modo que me retornasse se os valores dos campos destas tables são diferentes, porém, embora eu possa fazer isto percorrendo os valores destas tables, eu gostaria de saber se a um modo mais prático de comparar (sem precisar percorrer as tables)
RODRIGOFERRO 02/09/2011 10:46:38
#383188
Resposta escolhida
da uma lida aqui amigao !

Compare two datasets in C#

Abraços !
CARLOSRAMIREZ 05/09/2011 21:06:24
#383475
Apenas uma dúvida, pelo exemplo que você passou, como os valores nas tables são diferentes, ocorre uma exceção na linha [Ô]ds.Relations.Add([Ô]ID_REL[Ô], dt1.Columns[0], dt2.Columns[0]);[Ô], com a mensagem [Ô]Esta restrição não pode ser ativada porque nem todos os valores possuem valores pai correspondentes.[Ô]

Então, presumi que para saber se as tables contém ou não valores diferentes, bastaria verificar se irá gerar a exceção, e caso gere, as tables são diferentes. Agora, eu simplesmente comentei a última linha do add na datatable2. Com isto, os há valores similares na datatable 1 e 2, porém, na datatable 2, há um valor a menos, logo ela seria diferente, e neste caso, não ocorreu a exceção. Eu entendi errado, como exatamente eu devo verificar se são iguais ou não? Seria mesmo pela exceção gerada? Abaixo o exemplo que usei e não gera a exceção

  DataTable dt1 = new DataTable([Ô]A[Ô]);
DataTable dt2 = new DataTable([Ô]B[Ô]);
DataSet ds = new DataSet();

textBox1.Text = string.Empty;

dt1.Columns.Add([Ô]ID[Ô], typeof(int));
dt1.PrimaryKey = new DataColumn[] {dt1.Columns[0]};
dt1.Rows.Add(1);
dt1.Rows.Add(2);
dt1.Rows.Add(3);

dt2.Columns.Add([Ô]ID[Ô], typeof(int));
dt2.Rows.Add(1);
dt2.Rows.Add(2);
//dt2.Rows.Add(4);

ds.Tables.Add(dt1);
ds.Tables.Add(dt2);
ds.Relations.Add([Ô]ID_REL[Ô], dt1.Columns[0], dt2.Columns[0]);


foreach (DataRow r in ds.Tables[[Ô]A[Ô]].Rows)
{
DataRow []child=r.GetChildRows([Ô]ID_REL[Ô]);
Console.Write(r[0] + [Ô] [Ô] );
if (child.Length != 0)
Console.WriteLine(child[0][0]);

Console.WriteLine();
}
CARLOSRAMIREZ 08/09/2011 12:44:47
#383718
Bem, ignorem meu último post, pois finalmente entendi corretamente o código. Bem ZEROCAL, seu código é realmente bom, eu não conhecia essa parte de relations, realmente interessante. Eu precisaria de um relation para duas colunas, pois o que identifica corretamente o meu registro são os campos coddisciplina e numturma. Então, achei mais prático o seguinte, como sou eu que insiro os registros neste dataset, adicionei mais uma coluna do tipo string que é a concatenação de coddisciplina e numturma. Para efetuar a comparação, achei o seguinte código que também gostei bastante . Este código é como o exemplo que achei na net, logo não há a referência a este meu campo novo.

                    DataTable dt1 = new DataTable([Ô]A[Ô]);
DataTable dt2 = new DataTable([Ô]B[Ô]);

dt1.Columns.Add([Ô]ID[Ô], typeof(string));
dt1.Rows.Add([Ô]v1[Ô]);
dt1.Rows.Add([Ô]v2[Ô]);
dt1.Rows.Add([Ô]v3[Ô]);


dt2.Columns.Add([Ô]ID[Ô], typeof(string));
dt2.Rows.Add([Ô]v1[Ô]);
//dt2.Rows.Add([Ô]v2[Ô]);
dt2.Rows.Add([Ô]v3[Ô]);

IEnumerable<string> idsInA = dt1.AsEnumerable().Select(row => (string)row[[Ô]ID[Ô]]);
IEnumerable<string> idsInB = dt2.AsEnumerable().Select(row => (string)row[[Ô]ID[Ô]]);
// ids de [Ô]b[Ô] que não existem e [Ô]a[Ô]
IEnumerable<string> bNotA = idsInB. Except(idsInA);
// ids de [Ô]a[Ô] que não existem e [Ô]b[Ô]
IEnumerable<string> aNotB = idsInA. Except(idsInB);
// quantidades de registros de [Ô]b[Ô] que não existem em [Ô]a[Ô]
int da = bNotA.Count();
// quantidades de registros de [Ô]a[Ô] que não existem em [Ô]b[Ô]
int ad = aNotB.Count();


Não sei se esta é a melhor solução, porém achei mais rápido de montar. Porém, indico a todos que vejam a parte de relations como o ZEROCAL, pois são muito úteis.
Tópico encerrado , respostas não são mais permitidas