Exemplo n.º 1
0
        public static ReconcileResult QuickReconcile(DataTable tbl1, DataTable tbl2, string table1_header, string table2_header, List <string> lstKey, List <string> lstIgnore, List <string> lstAmbiguousSortKey)
        {
            ReconcileResult result = new ReconcileResult(table1_header, table2_header);

            if (tbl1.Rows.Count != tbl2.Rows.Count)
            {
                result.Add("Data Count is differnt Tbl1:" + tbl1.Rows.Count.ToString() + " tbl2:" + tbl2.Rows.Count.ToString(), null, null, null, null);
            }
            else
            {
                string   strSortKey = GetSortString(lstKey);
                DataView dv1        = new DataView(tbl1, null, strSortKey, DataViewRowState.CurrentRows);
                DataView dv2        = new DataView(tbl2, null, strSortKey, DataViewRowState.CurrentRows);

                for (int i = 0; i < dv1.Count; i++)
                {
                    DataRow r1  = dv1[i].Row;
                    DataRow r2  = dv2[i].Row;
                    string  key = GetFilterString(r1, lstKey);
                    foreach (DataColumn c in tbl1.Columns)
                    {
                        if (lstIgnore.Contains(c.ColumnName))
                        {
                            continue;
                        }

                        object obj1 = r1[c.ColumnName];
                        object obj2 = r2[c.ColumnName];


                        if (r1[c.ColumnName] != r2[c.ColumnName])
                        {
                            if (Convert.IsDBNull(obj1) == false && Convert.IsDBNull(obj2) == false)
                            {
                                if (c.DataType == typeof(decimal))
                                {
                                    decimal dec1 = Convert.ToDecimal(obj1);
                                    decimal dec2 = Convert.ToDecimal(obj2);
                                    if (dec1 == dec2)
                                    {
                                        continue;
                                    }
                                }
                                else
                                {
                                    if (obj1.ToString().Trim().Equals(obj2.ToString().Trim()))
                                    {
                                        continue;
                                    }
                                }
                            }
                            result.Add(key, c, r1, r2, null);
                        }
                    }
                }
            }

            return(result);
        }
Exemplo n.º 2
0
        private static void reconcileDuplicates(string key, ReconcileResult result, List <string> lstIgnore, List <string> lstAmbiguousSortKey, DataTable tbl1, DataTable tbl2)
        {
            StringBuilder strBuf = new StringBuilder();

            foreach (string i in lstAmbiguousSortKey)
            {
                if (strBuf.Length > 0)
                {
                    strBuf.Append(" , ");
                }
                strBuf.Append(i);
            }
            DataView dv1 = new DataView(tbl1, key, strBuf.ToString(), DataViewRowState.CurrentRows);
            DataView dv2 = new DataView(tbl2, key, strBuf.ToString(), DataViewRowState.CurrentRows);

            if (dv1.Count != dv2.Count)
            {
                Console.WriteLine("Count mismatch in" + key);
                Console.WriteLine("Table1:" + dv1.Count + "\tTable2:" + dv2.Count);
                result.AddCountMismatch(key, new DataColumn("Different Count"), dv1.Count, dv2.Count);
            }
            else
            {
                for (int i = 0; i < dv1.Count; i++)
                {
                    DataRow r1 = dv1[i].Row;
                    DataRow r2 = dv2[i].Row;
                    foreach (DataColumn c in tbl1.Columns)
                    {
                        if (lstIgnore.Contains(c.ColumnName))
                        {
                            continue;
                        }

                        object obj1 = r1[c.ColumnName];
                        object obj2 = r2[c.ColumnName];


                        if (r1[c.ColumnName] != r2[c.ColumnName])
                        {
                            if (Convert.IsDBNull(obj1) == false && Convert.IsDBNull(obj2) == false)
                            {
                                //if (c.DataType == typeof(string))
                                {
                                    if (obj1.ToString().Trim().Equals(obj2.ToString().Trim()))
                                    {
                                        continue;
                                    }
                                }
                            }
                            string subKey = GetFilterString(r1, lstAmbiguousSortKey);
                            //Console.WriteLine(key + ":" + subKey);
                            result.Add(key + ":" + subKey, c, r1, r2, null);
                        }
                    }
                }
            }
        }
Exemplo n.º 3
0
        internal void simpleMatching(ReconcileResult result, DataRow r1, DataRow r2, string col1, string col2, string key)
        {
            object obj1 = r1[col1];
            object obj2 = r2[col2];


            if (obj1 != obj2)
            {
                if (Convert.IsDBNull(obj1) == false && Convert.IsDBNull(obj2) == false)
                {
                    //if (c.DataType == typeof(string))
                    {
                        if (obj1.ToString().Trim().Equals(obj2.ToString().Trim()))
                        {
                            return;
                        }
                    }
                }
                result.Add(key, r1.Table.Columns[col1], r1, r2, null);
            }
        }
Exemplo n.º 4
0
        public static ReconcileResult Reconcile(DataTable tbl1, DataTable tbl2, string table1_header, string table2_header, List <string> lstKey, List <string> lstIgnore, List <string> lstAmbiguousSortKey)
        {
            ReconcileResult result           = new ReconcileResult(table1_header, table2_header);
            List <string>   lstDuplicatesKey = new List <string>();
            string          strSortKey       = GetSortString(lstKey);

            tbl1.DefaultView.Sort = strSortKey;
            tbl2.DefaultView.Sort = strSortKey;

            foreach (DataRow r1 in tbl1.Rows)
            {
                string    key  = GetFilterString(r1, lstKey);
                DataRow[] rows = tbl2.Select(key);

                if (rows == null || rows.Length == 0)
                {
                    result.Add(key, null, r1, null, null);
                }
                else
                {
                    if (rows.Length > 1)
                    {
                        lock (lstDuplicatesKey)
                        {
                            if (lstDuplicatesKey.Contains(key) == false)
                            {
                                lstDuplicatesKey.Add(key);
                            }
                        }
                    }
                    else
                    {
                        DataRow r2 = rows[0];
                        foreach (DataColumn c in tbl1.Columns)
                        {
                            if (lstIgnore.Contains(c.ColumnName))
                            {
                                continue;
                            }

                            object obj1 = r1[c.ColumnName];
                            object obj2 = r2[c.ColumnName];


                            if (r1[c.ColumnName] != r2[c.ColumnName])
                            {
                                if (Convert.IsDBNull(obj1) == false && Convert.IsDBNull(obj2) == false)
                                {
                                    //if (c.DataType == typeof(string))
                                    {
                                        if (obj1.ToString().Trim().Equals(obj2.ToString().Trim()))
                                        {
                                            continue;
                                        }
                                    }
                                }
                                result.Add(key, c, r1, r2, null);
                            }
                        }
                    }
                }
            }

            foreach (DataRow r2 in tbl2.Rows)
            {
                string    key  = GetFilterString(r2, lstKey);
                DataRow[] rows = tbl1.Select(key);
                if (rows == null || rows.Length == 0)
                {
                    result.Add(key, null, null, r2, null);
                }
                else if (rows.Length > 1)
                {
                    lock (lstDuplicatesKey)
                    {
                        if (lstDuplicatesKey.Contains(key) == false)
                        {
                            lstDuplicatesKey.Add(key);
                        }
                    }
                }
            }

            foreach (string key in lstDuplicatesKey)
            {
                reconcileDuplicates(key, result, lstIgnore, lstAmbiguousSortKey, tbl1, tbl2);
            }

            return(result);
        }
Exemplo n.º 5
0
        /*
         * This reconciliation is done between different schema table
         */
        public static ReconcileResult CustomReconcile(DataTable tbl1, DataTable tbl2, string table1_header, string table2_header, Dictionary <string, string> dictKey, Dictionary <string, string> dictCompareColumns, Dictionary <string, string> dictAmbigousSortKey, BaseReconcile reconcileMethod = null)
        {
            ReconcileResult result = new ReconcileResult(table1_header, table2_header);

            if (reconcileMethod == null)
            {
                reconcileMethod = new BaseReconcile();
            }
            Dictionary <string, string> dictDuplicatesKey = new Dictionary <string, string>(Math.Max(tbl1.Rows.Count, tbl2.Rows.Count));
            string        strSortKeyTbl1 = GetSortString(dictKey.Keys.ToList());
            List <string> lstKey2        = new List <string>();

            foreach (string k in dictKey.Keys)
            {
                lstKey2.Add(dictKey[k]);
            }
            string strSortKeyTbl2 = GetSortString(lstKey2);

            tbl1.DefaultView.Sort = strSortKeyTbl1;
            tbl2.DefaultView.Sort = strSortKeyTbl2;

            foreach (DataRow r1 in tbl1.Rows)
            {
                string tbl1_key = GetFilterString(r1, dictKey.Keys.ToList());
                if (dictDuplicatesKey.ContainsKey(tbl1_key))
                {
                    continue;
                }
                string    tbl2_key = GetCounterpartFilterString(r1, dictKey, true);
                DataRow[] rows     = tbl2.Select(tbl2_key);

                if (rows == null || rows.Length == 0)
                {
                    result.Add(tbl1_key, null, r1, null, null);
                }
                else
                {
                    if (rows.Length > 1)
                    {
                        lock (dictDuplicatesKey)
                        {
                            if (dictDuplicatesKey.ContainsKey(tbl1_key) == false)
                            {
                                dictDuplicatesKey.Add(tbl1_key, tbl2_key);
                            }
                        }
                    }
                    else
                    {
                        DataRow r2 = rows[0];
                        reconcileMethod.Reconcile(result, r1, r2, tbl1_key, table1_header, table2_header, dictKey, dictCompareColumns);
                    }
                }
            }
            int i = 0;

            foreach (DataRow r2 in tbl2.Rows)
            {
                i++;
                string tbl1_key = GetCounterpartFilterString(r2, dictKey, false);

                if (dictDuplicatesKey.ContainsKey(tbl1_key))
                {
                    continue;
                }
                string    tbl2_key = GetFilterString(r2, dictKey.Values.ToList());
                DataRow[] rows     = tbl1.Select(tbl1_key);
                if (rows == null || rows.Length == 0)
                {
                    result.Add(tbl1_key, null, null, r2, null);
                }
                else if (rows.Length > 1)
                {
                    lock (dictDuplicatesKey)
                    {
                        if (dictDuplicatesKey.ContainsKey(tbl1_key) == false)
                        {
                            dictDuplicatesKey.Add(tbl1_key, tbl2_key);
                        }
                    }
                }
            }

            foreach (string key in dictDuplicatesKey.Keys)
            {
                Console.WriteLine("Duplicate in " + key);
                reconcileCustomDuplicates(key, dictDuplicatesKey[key], result, dictCompareColumns, dictAmbigousSortKey, tbl1, tbl2, reconcileMethod);
            }

            return(result);
        }