sqlserver合并DataTable并排除重复数据的通用方法分享

 更新时间:2011年12月20日 11:50:09   作者:  
网上合并DataTable通用方法的文章很多,结合项目开发中的常用需求,并借鉴网上的做法,写了一个合并DataTable的通用方法,主要功能是合并两个DataTable(结构可以不同,如字段不完全一致),并可以根据某一列值进行排重处理
代码如下:
复制代码 代码如下:

///<summary>
/// 将两个列不同的DataTable合并成一个新的DataTable
///</summary>
///<param name="dt1">源表</param>
///<param name="dt2">需要合并的表</param>
///<param name="primaryKey">需要排重列表(为空不排重)</param>
///<param name="maxRows">合并后Table的最大行数</param>
///<returns>合并后的datatable</returns>
public static DataTable MergeDataTable(DataTable dt1, DataTable dt2, string primaryKey, 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)
{
Type t = dt2.Rows[0][primaryKey].GetType();
bool isNeedFilter = string.IsNullOrEmpty(primaryKey) ? false : true;
bool isNeedQuotes = t.Name == "String" ? true : false;
int mergeTableNum = dt.Rows.Count;
for (int i = 0; i < dt2.Rows.Count && mergeTableNum < maxRows; i++)
{
bool isNeedAdd = true;
//如果需要排重时,判断是否需要添加当前行
if (isNeedFilter)
{
string primaryValue = dt2.Rows[i][primaryKey].ToString();
string fileter = primaryKey + "=" + primaryValue;
if(isNeedQuotes)
{
fileter = primaryKey + "='" + primaryValue + "'";
}
DataRow[] drs = dt.Select(fileter);
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;
}

相关文章

  • SQL Server 2016 Alwayson新增功能图文详解

    SQL Server 2016 Alwayson新增功能图文详解

    sqlserver2016发布有一段时间了,下面跟着脚本之家小编一起看看2016在Alwyson上做了哪些改进?需要的朋友通过本文了解下吧
    2017-09-09
  • 查询表中某字段有重复记录个数的方法

    查询表中某字段有重复记录个数的方法

    本篇文章介绍了,查询表中某字段有重复记录个数的方法。需要的朋友参考下
    2013-04-04
  • SQL SERVER数据库重建索引的方法

    SQL SERVER数据库重建索引的方法

    Sql Server查询缓慢的原因有很多,比如服务器资源不足、网络故障、查询语句不够优化,I/O问题等等,以及本文要说的数据库索引问题
    2014-07-07
  • SQL中查找某几个字段完全一样的数据

    SQL中查找某几个字段完全一样的数据

    本文分享SQL语句实现表中字段的组合累加排序的实例代码,希望能给大家做一个参考。
    2016-06-06
  • 详解SQL中的DQL查询语言

    详解SQL中的DQL查询语言

    这篇文章主要介绍了SQL中的DQL查询语言,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-05-05
  • SQL SERVER实现连接与合并查询

    SQL SERVER实现连接与合并查询

    本文详细讲解了SQL SERVER实现连接与合并查询的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-02-02
  • 详解SQL游标的用法

    详解SQL游标的用法

    这篇文章主要介绍了SQL游标的用法,文中讲解非常详细,配合代码帮助大家更好的理解学习,感兴趣的朋友可以了解下
    2020-06-06
  • 数据库性能优化一:数据库自身优化提升性能

    数据库性能优化一:数据库自身优化提升性能

    数据库自身优化包括:增加次数据文件,设置文件自动增长、表分区,索引分区、分布式数据库设计、整理数据库碎片等等.需要了解的朋友可以参考下
    2013-01-01
  • 浅析SQL存储过程和事务处理

    浅析SQL存储过程和事务处理

    在Sql Server数据库的存储过程中如何使用事务来完成数据的批量操作呢?下面小编就详细的为大家介绍一下。需要的朋友可以过来参考参考
    2013-08-08
  • asp.net中如何调用sql存储过程实现分页

    asp.net中如何调用sql存储过程实现分页

    使用sql存储过程实现分页,在网上能找到好多种解决方案,但是如何用asp.net后台调用呢,通过本篇文章小编给大家详解asp.net中如何调用sql存储过程实现分页,有需要的朋友可以来参考下
    2015-08-08

最新评论