Commit 62593bb0 authored by tr's avatar tr

1、DataTable两表复制优化

2、增加DataRow行复制
parent 4689bf85
...@@ -65,23 +65,38 @@ namespace FunnyPick ...@@ -65,23 +65,38 @@ namespace FunnyPick
/// <summary> /// <summary>
/// 复制相同列 /// 复制两表(针对同结构,不同结构只复制相同列)
/// </summary> /// </summary>
/// <param name="dtFrom">源表</param> /// <param name="dtFrom">源表</param>
/// <param name="dtTarget">目标表</param> /// <param name="dtTarget">目标表</param>
/// <param name="distinctCol">去重列</param> /// <param name="distinctCol">去重列</param>
/// <param name="ExceptColList">去除列(即包含在此列表中的列不复制)</param> /// <param name="AlwaysList">总是覆盖列(即包含在此列表中的列总是复制)</param>
public void CopySameCol(DataTable dtFrom, DataTable dtTarget, string distinctCol, List<string> ExceptColList = null) /// <param name="ExceptList">去除列(即包含在此列表中的列不复制)</param>
public void CopyTable(DataTable dtFrom, DataTable dtTarget, string distinctCol = "", List<string> AlwaysList = null, List<string> ExceptList = null)
{ {
if (dtFrom == null || dtTarget == null)
return;
//
foreach (DataRow r in dtFrom.Rows) foreach (DataRow r in dtFrom.Rows)
{ {
if (IsIllegalDataRow(r)) if (IsIllegalDataRow(r))
continue; continue;
//如果去重列不为空,并且两表都包含该列,则取出重复值 //如果去重列不为空,并且两表都包含该列,则去除重复值
if (!string.IsNullOrEmpty(distinctCol) && dtFrom.Columns.Contains(distinctCol) && dtTarget.Columns.Contains(distinctCol)) if (!string.IsNullOrEmpty(distinctCol) && dtFrom.Columns.Contains(distinctCol) && dtTarget.Columns.Contains(distinctCol))
{ {
if (dtTarget.Select($"{distinctCol}='{r[distinctCol]}'").Length > 0) DataRow[] rows = dtTarget.Select($"{distinctCol}='{r[distinctCol]}'");
if (rows.Length > 0 && AlwaysList != null)
{
foreach (var s in AlwaysList)
{
if (!dtFrom.Columns.Contains(s) || !dtTarget.Columns.Contains(s))
continue;
rows[0][s] = r[s];
}
rows[0].EndEdit();
continue; continue;
}
} }
//创建目标新行 //创建目标新行
DataRow drNew = dtTarget.NewRow(); DataRow drNew = dtTarget.NewRow();
...@@ -89,7 +104,7 @@ namespace FunnyPick ...@@ -89,7 +104,7 @@ namespace FunnyPick
{ {
string ColName = c.ColumnName; string ColName = c.ColumnName;
//ID和指定忽略的列,不复制 //ID和指定忽略的列,不复制
if (ColName.Equals("ID") || ExceptColList?.IndexOf(ColName) >= 0) if (ColName.Equals("ID") || ExceptList?.IndexOf(ColName) >= 0)
continue; continue;
if (dtTarget.Columns.Contains(ColName)) if (dtTarget.Columns.Contains(ColName))
{ {
...@@ -100,6 +115,32 @@ namespace FunnyPick ...@@ -100,6 +115,32 @@ namespace FunnyPick
dtTarget.Rows.Add(drNew); dtTarget.Rows.Add(drNew);
} }
} }
/// <summary>
/// 复制两行(针对相同结构,不同结构只复制相同列)
/// </summary>
/// <param name="drFrom">源行</param>
/// <param name="drTarget">目标行</param>
/// <param name="ExceptList">去除列(即其中包含的列不复制到目标行)</param>
public static void CopyRow(DataRow drFrom, DataRow drTarget, List<string> ExceptList = null)
{
if (drFrom == null || drTarget == null)
return;
//
foreach (DataColumn c in drFrom.Table.Columns)
{
string ColName = c.ColumnName;
//ID和指定列不复制
if (ColName.Equals("ID") || ExceptList?.IndexOf(ColName) >= 0)
continue;
if (drTarget.Table.Columns.Contains(ColName))
{
drTarget[ColName] = drFrom[ColName];
}
drTarget.EndEdit();
}
}
/// <summary> /// <summary>
/// 是否无效行 /// 是否无效行
/// </summary> /// </summary>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment