zoukankan      html  css  js  c++  java
  • 比较两个DataTable数据(结构相同),返回新增的,删除的,修改前的,修改后的 DataTable

    代码
            /// <summary>
            
    /// 比较两个DataTable数据(结构相同)
            
    /// </summary>
            
    /// <param name="dt1">来自数据库的DataTable</param>
            
    /// <param name="dt2">来自文件的DataTable</param>
            
    /// <param name="keyField">关键字段名</param>
            
    /// <param name="dtRetAdd">新增数据(dt2中的数据)</param>
            
    /// <param name="dtRetDif1">不同的数据(数据库中的数据)</param>
            
    /// <param name="dtRetDif2">不同的数据(图2中的数据)</param>
            
    /// <param name="dtRetDel">删除的数据(dt2中的数据)</param>
            public static void CompareDt(DataTable dt1, DataTable dt2, string keyField,
                
    out DataTable dtRetAdd, out DataTable dtRetDif1, out DataTable dtRetDif2,
                
    out DataTable dtRetDel)
            {
                
    //为三个表拷贝表结构
                dtRetDel = dt1.Clone();
                dtRetAdd 
    = dtRetDel.Clone();
                dtRetDif1 
    = dtRetDel.Clone();
                dtRetDif2 
    = dtRetDel.Clone();

                
    int colCount = dt1.Columns.Count;

                DataView dv1 
    = dt1.DefaultView;
                DataView dv2 
    = dt2.DefaultView;

                
    //先以第一个表为参照,看第二个表是修改了还是删除了
                foreach (DataRowView dr1 in dv1)
                {
                    dv2.RowFilter 
    = keyField + " = '" + dr1[keyField].ToString() + "'";
                    
    if (dv2.Count > 0)
                    {
                        
    if (!CompareUpdate(dr1, dv2[0]))//比较是否有不同的
                        {
                            dtRetDif1.Rows.Add(dr1.Row.ItemArray);
    //修改前
                            dtRetDif2.Rows.Add(dv2[0].Row.ItemArray);//修改后
                            dtRetDif2.Rows[dtRetDif2.Rows.Count - 1]["FID"= dr1.Row["FID"];//将ID赋给来自文件的表,因为它的ID全部==0
                            continue;
                        }
                    }
                    
    else
                    {
                        
    //已经被删除的
                        dtRetDel.Rows.Add(dr1.Row.ItemArray);
                    }
                }

                
    //以第一个表为参照,看记录是否是新增的
                dv2.RowFilter = "";//清空条件
                foreach (DataRowView dr2 in dv2)
                {
                    dv1.RowFilter 
    = keyField + " = '" + dr2[keyField].ToString() + "'";
                    
    if (dv1.Count == 0)
                    {
                        
    //新增的
                        dtRetAdd.Rows.Add(dr2.Row.ItemArray);
                    }
                }
            }

            
    //比较是否有不同的
            private static bool CompareUpdate(DataRowView dr1, DataRowView dr2)
            {
                
    //行里只要有一项不一样,整个行就不一样,无需比较其它
                object val1;
                
    object val2;
                
    for (int i = 1; i < dr1.Row.ItemArray.Length; i++)
                {
                    val1 
    = dr1[i];
                    val2 
    = dr2[i];
                    
    if (!val1.Equals(val2))
                    {
                        
    return false;
                    }
                }
                
    return true;
            }
  • 相关阅读:
    使用用Ghost制作的win2k3和winxp文件具有相同的SID的解决办法
    64 bits Windows 7 使用 regsvr32 的註冊方式(转)
    怎么实现用户匿名访问web,但数据库要用Windows集成验证方式(数据库和web服务器分别在两台机器上)
    为什么按照微软给定的匿名配置Web 同步最终造成创建订阅的步骤总是失败?但改为需要身份验证就行了
    How to edit Team Build Types
    利用WhiteHose一步步建立分布式系统的框架(二)创建LDD步骤
    发现:InfoPath 2007 Training Labs地址
    在MSF中怎么区分易混淆的工作项类型:Bug、风险和问题(我个人的理解)
    RGB Colour Map
    How to distinguish Design time or Running time in Mobile cusotmer Contorl(the NetCF2.0 is different to NetCF1.0)
  • 原文地址:https://www.cnblogs.com/houlinbo/p/1667189.html
Copyright © 2011-2022 走看看