如何将一个DataTable的列数据复制到另一个DataTable,即使两个DataTable之间存在不同的列名?

3

我有两个数据表。

第一个是:

DataTable NameAddressPhones = new DataTable(); 

有一个三列表格,包含姓名、地址和电话号码。但是我只需要姓名和地址这两列数据,所以我想将这些列(及其数据)复制到新的DataTable中。

DataTable NameAddress = new DataTable(); 

为此,我所做的是:
            foreach (DataRow sourcerow in NameAddressPhones.Rows)
            {
                DataRow destRow = NameAddress.NewRow();
                foreach (string colname in columns)
                {
                    destRow[colname] = sourcerow[colname];
                }
                NameAddress.Rows.Add(destRow);
            }

每次表中插入新记录时,我都会清除NameAddressPhones(first)DataTable。每次列数相同,但列名将不同,例如Nm而不是Name,Add而不是Address。现在问题是第二个DataTable已经有了列名Name和Address,现在我想将第一个DataTable的Nm和Add列数据复制到第二个DataTable,但列名与第二个DataTable的列名不同。因此,即使有不同的列名,我也想将第一个DataTable的Nm列数据复制到第二个DataTable的Name列,将第一个DataTable的Add列数据复制到第二个DataTable的Address列。
简而言之,即使两个DataTable有不同的列名,如第一个DataTable的Nm是列名,第二个DataTable的Name是列名,则应将Nm列的数据复制到Name列。
3个回答

10

这是最简单的方法:

foreach (DataRow sourcerow in NameAdressPhones.Rows)
{
    DataRow destRow = NameAdress.NewRow();
    destRow["Name"] = sourcerow["Nm"];
    destRow["Address"] = sourcerow["Add"];
    NameAdress.Rows.Add(destRow);
}

当自动化可用时,它是非常好的。但当不可用时,你需要以某种方式将源列映射到目标列。

如果两个表中的列顺序相同,你可以通过序数引用值而不是列名,但这是一个非常糟糕的想法,我甚至不会为此发布任何代码。


@MusiGenesis,谢谢...太好了..我从没想过这样。但是先生,我该如何映射这些列呢? - Harikrishna
如果你使用我的代码示例,那就是地图。如果你想要变得复杂一些,并在某个地方维护一堆列映射列表,你可以这样做,但你可能会增加更多的工作量。 - MusiGenesis
每次列的顺序都不固定。例如,列Nm一次可能具有索引号0,然后下一次可能在表中的位置2。那么它还能工作吗? - Harikrishna
@Harikrishna:规则是用来打破的,但这个例外。绝对不能通过索引引用列,因为底层数据库(或SELECT查询)中的列顺序很容易改变。 - MusiGenesis
这是指按列名引用列,这样就不会出问题了吗? - Harikrishna

1

使用列索引号而不是名称:

destRow[0] = sourcerow[0]; // for column 0 = "Name" or "NM"

@SeaDrive,但是列的固定索引位置是不确定的。例如,列Nm可能在位置0或者不在。 - Harikrishna
你必须有一种方法来确定你想要哪些列,即需要某种方式防止将地址放入名称列中。无论你如何知道这一点,使用序数或字符串变量作为索引应该不难处理。n1 = "名称"; n2 = "Nm";// 稍后destRow[n1] = sourceRow[n2]; - SeaDrive

0

如果我理解你的问题正确,那么通常的做法是使用存储过程。你在两个数据库中都有相同的存储过程,但实现是针对每个数据库的表模式的。这样可以提供所需的抽象。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接