Archivos para febrero, 2009

Diferencias entre dos datatables

Posted in Programación with tags , , , on 10 febrero, 2009 by febrer

Este es un interesante script que devuelve la diferencia entre dos datatables. Su funcionamiento es similar a realizar un LEFT JOIN en Transact SQL. La diferencia es que en este método, utilizamos el objeto DataRelation de .NET. He tenido que utilizar este método ya que los origenes de los datatables, son de conexiones direferentes, por lo que la utilización de LEFT JOIN, no es posible.

///
/// Devuelve un datatable con las diferencias entre los datatables de entrada
///
///
1er datatable ///
2o datatable ///
public static DataTable Difference(DataTable First, DataTable Second)
{
//creamos una tabla vacia
DataTable table = new DataTable(“Diferencias”);

//creamos un dataSet para poder utilizar el objeto DataRelation
using (DataSet ds = new DataSet())
{
//añadimos una copia de las tablas
ds.Tables.AddRange(new DataTable[] { First.Copy(), Second.Copy() });
//creamos un dataColumn con las columnas del datatable 1.
DataColumn[] firstcolumns = new DataColumn[ds.Tables[0].Columns.Count];
for (int i = 0; i < firstcolumns.Length; i++)
{
firstcolumns[i] = ds.Tables[0].Columns[i];
}

DataColumn[] secondcolumns = new DataColumn[ds.Tables[1].Columns.Count];
for (int i = 0; i < secondcolumns.Length; i++)
{
secondcolumns[i] = ds.Tables[1].Columns[i];
}
//creamos la relación
DataRelation r = new DataRelation(string.Empty, firstcolumns, secondcolumns, false);
ds.Relations.Add(r);

//creamos las columnas en el datatable a devolver.
for (int i = 0; i < First.Columns.Count; i++)
{
table.Columns.Add(First.Columns[i].ColumnName, First.Columns[i].DataType);
}

//si la primera fila no esta en la segunda tabla, la añadimos a la tabla.
table.BeginLoadData();
foreach (DataRow parentrow in ds.Tables[0].Rows)
{
DataRow[] childrows = parentrow.GetChildRows(r);
if (childrows == null || childrows.Length == 0)
table.LoadDataRow(parentrow.ItemArray, true);
}
table.EndLoadData();
}

return table;
}