如何在 C# 中合并两个数据表(没有任何公共标识符)?8
Posted
技术标签:
【中文标题】如何在 C# 中合并两个数据表(没有任何公共标识符)?8【英文标题】:How to merge two datatables in c# (without any common identifier)?8 【发布时间】:2014-10-29 10:39:56 【问题描述】:我正在尝试合并两个数据表 dt 和 dt4。我想将 2 个具有不同架构且没有通用标识符的数据表合并在一起。因为第一个数据表 dt 包含一些值。我得到 x 的 dt 计数。基于该计数,我必须获取一些值表并存储在 dt4 中。如果如果 dt 包含 3 个行值,则 x=3 并且 dt4 包含 3 个值。在这些过程之后,我必须合并 dt 和 dt4 并显示为一个表。
使用下面给出的代码时出现一个错误。错误是:"'column' argument cannot be null."
帮我找到合适的解决方案。谢谢。
代码:
protected void ddlCircle_SelectedIndexChanged(object sender, EventArgs e)
ShadingAnalysisDataSetTableAdapters.tbl_CadEngineersTeamTableAdapter cd;
cd = new ShadingAnalysisDataSetTableAdapters.tbl_CadEngineersTeamTableAdapter();
DataTable dt = new DataTable();
dt = cd.GetAvailableData(ddlCircle.SelectedValue); // Getting details of unassigned site
int x, y;
DataTable dt3 = new DataTable();
dt3 = cd.GetTeam();
y = dt3.Rows.Count;
x = dt.Rows.Count; // counting the unassinged sites
DataTable dt2 = new DataTable();
dt2 = cd.GetAssignTeam(x); //Getting team based on count
string[] arr = new string[dt2.Rows.Count];
int i = 0;
foreach (DataRow r in dt2.Rows)
arr[i] = r["Team"].ToString(); // assigning available team to array
i++;
string[] strArr = new string[x+1]; // another array to copy arr values.
i = 0; int j = 0;
while (j <= x)
strArr[j]= arr[i] ; // copying the arr[] values into strArr[] based on count.
i++;
j++;
if (i == y)
i = 0;
DataTable dt4 = new DataTable();
dt4.Columns.Add("Team");
foreach (string s in strArr)
dt4.Rows.Add(s); // Converting string array strArr[] to data table dt4
dt.Merge(dt4); // error poppup here. Error : 'column' argument cannot be null.
GridView2.DataSource = dt;
GridView2.DataBind();
dt 包含
State District SiteID SiteName
----- -------- ------ --------
Sate1 District1 1001 A
Sate2 District2 1002 B
Sate3 District3 1003 C
dt4 包含
Team
-----
Team1
Team2
Team3
我需要一个最终输出为:
State District SiteID SiteName Team
----- -------- ------ -------- -----
Sate1 District1 1001 A Team1
Sate2 District2 1002 B Team2
Sate3 District3 1003 C Team3
【问题讨论】:
没有任何共同的列,甚至没有单一的条件!!!兄弟,你在做什么..如果你如何合并这些数据表(通过使用循环等),这将是非常讨厌的。因为如果有人在表中删除或添加数据会发生什么......你将如何与其他表关联! @yogi970 :我得到了基于 dt 计数的 dt4 值。所以添加或删除数据时没有问题 【参考方案1】:你们有关系吗。如果您在第一个表中有主键 ID,您可以在第二个表中添加 ID 列
请看这里MSDN Article Merge Datatables
【讨论】:
【参考方案2】:如果您在 2 个数据表之间添加关系,例如公共标识符 - 您将能够使用 Linq 自动提取数据表之间的公共列。
类似于以下内容;
var commonColumns = dt1.Columns.OfType<DataColumn>().Intersect(dt2.Columns.OfType<DataColumn>(), new DataColumnComparer());
DataTable result = new DataTable();
dt1.PrimaryKey = commonColumns.ToArray();
result.Merge(dt1, false, MissingSchemaAction.AddWithKey);
result.Merge(dt2, false, MissingSchemaAction.AddWithKey);
看看之前关于这个Full outer join, on 2 data tables, with a list of columns的问题
【讨论】:
没有任何通用标识符如何合并两个数据表。 为什么要将 2 个具有不同架构且没有通用标识符的数据表合并在一起? 要获得所需的输出,请在每个数据表中添加一个 ID 列,并增加一个标识。在您的循环中,您可以为第一条记录添加 1,为第二条记录添加 2,等等。这将针对两个表完成......然后使用我的逻辑将它们合并在一起。 我想将 2 个数据表合并在一起,它们具有不同的模式,并且没有共同的标识符。因为第一个数据表 dt 包含一些值。我得到 x 的 dt 计数。基于该计数,我必须获取一些值表并存储在 dt4 中。如果如果 dt 包含 3 个行值,则 x=3 并且 dt4 包含 3 个值。在这些过程之后,我必须合并 dt 和 dt4 并显示为一个表格。 那么在这种情况下,为什么不获取第一个表,迭代记录,然后使用所需的缺失列值更新每条记录?【参考方案3】:给定的代码运行良好。感谢所有宝贵的 cmets。
代码:
protected void ddlCircle_SelectedIndexChanged(object sender, EventArgs e)
ShadingAnalysisDataSetTableAdapters.tbl_CadEngineersTeamTableAdapter cd;
cd = new ShadingAnalysisDataSetTableAdapters.tbl_CadEngineersTeamTableAdapter();
DataTable dt = new DataTable();
dt = cd.GetAvailableData(ddlCircle.SelectedValue); // Getting details of unassigned site
int x, y;
DataTable dt3 = new DataTable();
dt3 = cd.GetTeam();
y = dt3.Rows.Count;
x = dt.Rows.Count; // counting the unassinged sites
DataTable dt2 = new DataTable();
dt2 = cd.GetAssignTeam(x); //Getting team based on count
string[] arr = new string[dt2.Rows.Count];
int i = 0;
foreach (DataRow r in dt2.Rows)
arr[i] = r["Team"].ToString(); // assigning available team to array
i++;
string[] strArr = new string[x+1]; // another array to copy arr values.
i = 0; int j = 0;
while (j <= x)
strArr[j]= arr[i] ; // copying the arr[] values into strArr[] based on count.
i++;
j++;
if (i == y)
i = 0;
DataTable dt4 = new DataTable();
dt4.Columns.Add("Team");
foreach (string s in strArr)
dt4.Rows.Add(s); // Converting string array strArr[] to data table dt4
//Adding new data table for merging two table details
DataTable dt7 = new DataTable();
//create columns and copy data from dt:
dt7 = dt.Copy();
foreach (DataColumn column in dt4.Columns)
dt7.Columns.Add(column.ColumnName, typeof(string));
//copy data from dt4:
foreach (DataRow row in dt4.Rows)
dt7.Rows[dt4.Rows.IndexOf(row)][5] = row[0];
GridView3.DataSource = dt7;
GridView3.DataBind();
【讨论】:
【参考方案4】:您与表 dt 和表 dt4 没有关系。
问题::您正面临此错误,因为您在这两个数据表之间没有任何关系。
我认为你最好先添加关系。如果您在 dt 中有主键 ID,您可以在 dt4 中添加具有相关 ID 的 ID 列。
所以首先在两个表中创建一个共同的列,然后基于该关系
你可以直接使用DataTable.Merge
方法
【讨论】:
以上是关于如何在 C# 中合并两个数据表(没有任何公共标识符)?8的主要内容,如果未能解决你的问题,请参考以下文章