sqlserver合并DataTable并排除重復(fù)數(shù)據(jù)的通用方法分享
更新時(shí)間:2011年12月20日 11:50:09 作者:
網(wǎng)上合并DataTable通用方法的文章很多,結(jié)合項(xiàng)目開(kāi)發(fā)中的常用需求,并借鑒網(wǎng)上的做法,寫(xiě)了一個(gè)合并DataTable的通用方法,主要功能是合并兩個(gè)DataTable(結(jié)構(gòu)可以不同,如字段不完全一致),并可以根據(jù)某一列值進(jìn)行排重處理
代碼如下:
///<summary>
/// 將兩個(gè)列不同的DataTable合并成一個(gè)新的DataTable
///</summary>
///<param name="dt1">源表</param>
///<param name="dt2">需要合并的表</param>
///<param name="primaryKey">需要排重列表(為空不排重)</param>
///<param name="maxRows">合并后Table的最大行數(shù)</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();
}
//復(fù)制dt1的數(shù)據(jù)
DataTable dt = dt1.Copy();
//補(bǔ)充dt2的結(jié)構(gòu)(dt1中沒(méi)有的列)到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));
}
}
//復(fù)制dt2的數(shù)據(jù)
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;
//如果需要排重時(shí),判斷是否需要添加當(dāng)前行
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;
}
}
//添加數(shù)據(jù)
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))
{
//防止因同一字段不同類型賦值出錯(cuò)
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;
}
復(fù)制代碼 代碼如下:
///<summary>
/// 將兩個(gè)列不同的DataTable合并成一個(gè)新的DataTable
///</summary>
///<param name="dt1">源表</param>
///<param name="dt2">需要合并的表</param>
///<param name="primaryKey">需要排重列表(為空不排重)</param>
///<param name="maxRows">合并后Table的最大行數(shù)</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();
}
//復(fù)制dt1的數(shù)據(jù)
DataTable dt = dt1.Copy();
//補(bǔ)充dt2的結(jié)構(gòu)(dt1中沒(méi)有的列)到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));
}
}
//復(fù)制dt2的數(shù)據(jù)
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;
//如果需要排重時(shí),判斷是否需要添加當(dāng)前行
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;
}
}
//添加數(shù)據(jù)
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))
{
//防止因同一字段不同類型賦值出錯(cuò)
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;
}
相關(guān)文章
SQL Server 2016 Alwayson新增功能圖文詳解
sqlserver2016發(fā)布有一段時(shí)間了,下面跟著腳本之家小編一起看看2016在Alwyson上做了哪些改進(jìn)?需要的朋友通過(guò)本文了解下吧2017-09-09查詢表中某字段有重復(fù)記錄個(gè)數(shù)的方法
本篇文章介紹了,查詢表中某字段有重復(fù)記錄個(gè)數(shù)的方法。需要的朋友參考下2013-04-04SQL SERVER數(shù)據(jù)庫(kù)重建索引的方法
Sql Server查詢緩慢的原因有很多,比如服務(wù)器資源不足、網(wǎng)絡(luò)故障、查詢語(yǔ)句不夠優(yōu)化,I/O問(wèn)題等等,以及本文要說(shuō)的數(shù)據(jù)庫(kù)索引問(wèn)題2014-07-07SQL中查找某幾個(gè)字段完全一樣的數(shù)據(jù)
本文分享SQL語(yǔ)句實(shí)現(xiàn)表中字段的組合累加排序的實(shí)例代碼,希望能給大家做一個(gè)參考。2016-06-06SQL SERVER實(shí)現(xiàn)連接與合并查詢
本文詳細(xì)講解了SQL SERVER實(shí)現(xiàn)連接與合并查詢的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-02-02數(shù)據(jù)庫(kù)性能優(yōu)化一:數(shù)據(jù)庫(kù)自身優(yōu)化提升性能
數(shù)據(jù)庫(kù)自身優(yōu)化包括:增加次數(shù)據(jù)文件,設(shè)置文件自動(dòng)增長(zhǎng)、表分區(qū),索引分區(qū)、分布式數(shù)據(jù)庫(kù)設(shè)計(jì)、整理數(shù)據(jù)庫(kù)碎片等等.需要了解的朋友可以參考下2013-01-01asp.net中如何調(diào)用sql存儲(chǔ)過(guò)程實(shí)現(xiàn)分頁(yè)
使用sql存儲(chǔ)過(guò)程實(shí)現(xiàn)分頁(yè),在網(wǎng)上能找到好多種解決方案,但是如何用asp.net后臺(tái)調(diào)用呢,通過(guò)本篇文章小編給大家詳解asp.net中如何調(diào)用sql存儲(chǔ)過(guò)程實(shí)現(xiàn)分頁(yè),有需要的朋友可以來(lái)參考下2015-08-08