zoukankan      html  css  js  c++  java
  • 关于.NET DataTable合并的问题

    公司里需要做一个合并的操作,网上查了一下,下面文章的代码写得很直白。

    http://www.cnblogs.com/freshman0216/archive/2011/11/25/2263845.html

    不过也有一些遗憾,就是不能够根据一些列来确定合并的范畴。所以做了一些改进。没有做过边界测试。代码如下:

            ///<summary>   
            /// 将两个列不同的DataTable合并成一个新的DataTable   
            ///</summary>   
            ///<param name="dt1">源表</param>   
            ///<param name="dt2">需要合并的表</param>   
            ///<param name="primaryKeys">需要排重的主要键列表(为空不排重)</param>   
            ///<param name="maxRows">合并后Table的最大行数</param>   
            ///<returns>合并后的datatable</returns>
            public static DataTable MergeDataTable(DataTable dt1, DataTable dt2, string[] primaryKeys, int maxRows)
            {
                //判断是否需要合并
                if (dt1 == null && dt2 == null)
                {
                    return null;
                }
                if (dt1 == null && dt2 != null)
                {
                    return dt2.Copy();
                }
                else if (dt1 != null && dt2 == null)
                {
                    return dt1.Copy();
                }
                //复制dt1的数据
                DataTable dt = dt1.Copy();
                //补充dt2的结构(dt1中没有的列)到dt中
                for (int i = 0; i < dt2.Columns.Count; i++)
                {
                    string cName = dt2.Columns[i].ColumnName;
                    if (!dt.Columns.Contains(cName))
                    {
                        dt.Columns.Add(new DataColumn(cName));
                    }
                }
                //复制dt2的数据
                if (dt2.Rows.Count > 0)
                {
                    
                    bool isNeedFilter = primaryKeys == null || primaryKeys.Length == 0 ? false : true;
                    
                    int mergeTableNum = dt.Rows.Count;
                    for (int i = 0; i < dt2.Rows.Count && mergeTableNum < maxRows; i++)
                    {
                        bool isNeedAdd = true;
                        //如果需要排重时,判断是否需要添加当前行
                        if (isNeedFilter)
                        {
                            string filter = "";
                            string primaryValue = "";
                            bool isNeedQuotes = false;
                            for (int j = 0; j < primaryKeys.Length; j++)
                            {
                                Type t = dt2.Rows[0][primaryKeys[j]].GetType();
                                isNeedQuotes = t.Name == "String" ? true : false;
                                primaryValue = dt2.Rows[i][primaryKeys[j]].ToString();
                                
                                if(isNeedQuotes)
                                {
                                    filter += primaryKeys[j] + "='" + primaryValue + "'";
                                }
                                else
                                {
                                    filter += (primaryKeys[j] + "=" + primaryValue);
                                }
    
                                if (j != primaryKeys.Length - 1)
                                {
                                    filter += " and ";
                                }
                            }
                            
                            DataRow[] drs = dt.Select(filter);
                            if (drs != null && drs.Length > 0)
                            {
                                isNeedAdd = false;
                            }
                        }
                        //添加数据
                        if (isNeedAdd)
                        {
                            DataRow dr = dt.NewRow();
                            for (int j = 0; j < dt.Columns.Count; j++)
                            {
                                string cName = dt.Columns[j].ColumnName;
                                if (dt2.Columns.Contains(cName))
                                {
                                   //防止因同一字段不同类型赋值出错
                                   if (dt2.Rows[i][cName] != null && dt2.Rows[i][cName] != DBNull.Value && dt2.Rows[i][cName].ToString() != "")
                                   {
                                      dr[cName] = dt2.Rows[i][cName];
                                   }
                                }
                            }
                            dt.Rows.Add(dr);
                            mergeTableNum++;
                        }
                    }
                }
                return dt;
            }
    

      

  • 相关阅读:
    python 输入年月日,返回当天是星期几
    python isdigit()函数
    python 字典复制(存疑)
    python 文本文件操作
    python 字符串实例:检查并判断密码字符串的安全强度
    python isinstance()判断数据类型
    python 字符串方法
    python format使用方法
    python 关于异常处理 try...except... 的两个案例
    gparted 不能起作用的时候,用fdisk
  • 原文地址:https://www.cnblogs.com/aicro/p/3029478.html
Copyright © 2011-2022 走看看