如何在 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的主要内容,如果未能解决你的问题,请参考以下文章

C#中两个数据表合并成一个表如何操作?

合并两个没有公共字段的表

C#如何将两个DataTable Row合并为一行

C#中如何将两个项目合并到一个项目中

根据 Pandas 中的公共列值合并两个数据框

如何在 VBA 中使用 SQL 将两个工作簿与一个公共列合并