ASP.net DataTable Relationでマスタ比較

        public void CompMst(DataTable pfrom, DataTable pto, List RelationCols, List NonCmopCols)
        {
            try
            {
                putLog(MethodBase.GetCurrentMethod(),"From=" + pfrom.TableName + " To=" + pto.TableName);

                for (int i = 0; i < NonCmopCols.Count; i++)
                {
                    NonCmopCols[i] = NonCmopCols[i].ToUpper();
                }

                if (pfrom.GetType().Equals(pto.GetType()) == false)
                {
                    putLog("型が不一致 From=" + pfrom.GetType().ToString() + " To=" + pto.GetType().ToString(), logType.Warn);
                    return;
                }

                if (pfrom.Columns.Count != pto.Columns.Count)
                {
                    putLog("列数が不一致 From=" + pfrom.Columns.Count.ToString() + " To=" + pto.Columns.Count.ToString(), logType.Warn);
                    return;
                }

                DataSet ds = new DataSet(); //from join to

                DataTable _from = pfrom.Copy();
                _from.TableName = "from";
                ds.Tables.Add(_from);

                DataTable _to = pto.Copy();
                _to.TableName = "to";
                ds.Tables.Add(_to);

                DataSet ds1 = new DataSet(); // to join from
                ds1.Tables.Add(_to.Copy());
                ds1.Tables.Add(_from.Copy());

                DataColumn[] colDs_0 = new DataColumn[RelationCols.Count];
                DataColumn[] colDs_1 = new DataColumn[RelationCols.Count];
                DataColumn[] colDs1_0 = new DataColumn[RelationCols.Count];
                DataColumn[] colDs1_1 = new DataColumn[RelationCols.Count];

                for (int i = 0; i  0)    //fromとtoの共通の行
                    {
                        foreach (DataRow r1 in rows)
                        {
                            // 項目の値を比較
                            string str = string.Empty;
                            bool mod = utility.Comp(r1, ref str, r0, NonCmopCols);
                            if (mod == true)
                            {
                                putLog("変更行 " + str);
                            }
                        }
                    }
                    else //fromにあってtoに無い。削除行
                    {
                        string str = string.Empty;
                        bool mod = utility.Comp(r0, ref str);
                        putLog("削除行 " + str);
                    }
                }

                foreach (DataRow r0 in ds1.Tables[0].Rows)
                {
                    if (r0.GetChildRows(ds1.Relations[0]).Length == 0)    //toにあってfromに無い。追加行
                    {
                        string str = string.Empty;
                        bool mod = utility.Comp(r0, ref str);
                        putLog("追加行 " + str);
                    }
                }
            }
            catch (Exception ex)
            {
                _putLog(ex);
            }
        }

        public static bool Comp(DataRow r, ref string str, DataRow r1 = null, List NonCmopCols = null)
        {
            StringBuilder sb = new StringBuilder();
            bool mod = false;

            for (int c = 0; c < r.Table.Columns.Count; c++)
            {
                sb.Append(r.Table.Columns[c].ColumnName + "=" + r[c].ToString());
                if (r1 != null)
                {
                    if (NonCmopCols != null && NonCmopCols.IndexOf(r.Table.Columns[c].ColumnName.ToUpper()) < 0)
                    {
                        if (r[c].Equals(r1[c]) == false)
                        {
                            mod = true;
                            sb.Append("<<" + r1[c].ToString() + ">>");
                        }
                    }
                }                                
                sb.Append("__ ");            
            }

            str = sb.ToString();
            return mod;
        }

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です