我如何比较两个数据表

时间:2011-01-15 07:58:40

标签: c#

我有一个由72列组成的数据表。

我将使用VSTO在Excel工作表中下载它,工作正常。

现在,用户将更改其中一行或所有这些行,并且还会插入一个新行。

考虑首先将数据表下载为dtA,将excel表中已修改的数据表作为dtB。

我想比较dtA和dtB。

我需要找出dtB中dtA中不存在的所有行。

我不能为每一行添加foreach循环,并评估它是一种非常不整齐的编码方式。

有什么更好的方法可以做到这一点?

我这样做了,

    DataTable dtA = new DataTable();
    dtA.Columns.Add("ENo");
    dtA.Columns.Add("ENo1");
    dtA.Columns.Add("ENo2");
    dtA.Columns.Add("ENo3");
    dtA.Columns.Add("ENo4");

    for (int i = 0; i < 5; i++)
    {
        DataRow dr = dtA.NewRow();
        dr[0] = "Part 0 " + i.ToString();
        dr[1] = "Part 1 " + i.ToString();
        dr[2] = "Part 2 " + i.ToString();
        dr[3] = "Part 3 " + i.ToString();
        dr[4] = "Part 4 " + i.ToString();
        dtA.Rows.Add(dr);
    }

    DataTable dtB = new DataTable();
    dtB.Columns.Add("ENo");
    dtB.Columns.Add("ENo1");
    dtB.Columns.Add("ENo2");
    dtB.Columns.Add("ENo3");
    dtB.Columns.Add("ENo4");

    for (int i = 5; i < 10; i++)
    {
        DataRow dr = dtB.NewRow();
        dr[0] = "Part 0 " + i.ToString();
        dr[1] = "Part 1 " + i.ToString();
        dr[2] = "Part 2 " + i.ToString();
        dr[3] = "Part 3 " + i.ToString();
        dr[4] = "Part 4 " + i.ToString();
        dtB.Rows.Add(dr);
    }

    Response.Write("\n");
    Response.Write("dt A");
    Response.Write("\n");

    for (int i = 0; i < dtA.Rows.Count; i++)
    {
        Response.Write(dtA.Rows[i][i].ToString());
        Response.Write("\n");
    }

    Response.Write("\n");
    Response.Write("dt B");
    Response.Write("\n");
    for (int i = 0; i < dtB.Rows.Count; i++)
    {
        Response.Write(dtB.Rows[i][i].ToString());
        Response.Write("\n");
    }

    var VarA = dtA.AsEnumerable();
    var varB = dtA.AsEnumerable();

    var diff = VarA.Except(varB);
    Response.Write("except");
    foreach (var n in diff)
    {
        Response.Write(n.Table.Rows[0].ToString());

    }

但是我不知道在foreach var中使用什么, 我该怎么用?

3 个答案:

答案 0 :(得分:1)

SELECT id FROM dtB WHERE id NOT IN (SELECT id FROM dtA)

答案 1 :(得分:0)

或许LINQ for DataSets(这只是表示DataSets支持LINQ并且是.NET 3.5+框架的一部分)可能是一种选择。特别是,请查看仅使用ExceptRows Set PatternIEnumerable.Except。如果行包含一些“唯一ID”,这是最简单的,但它应该足以覆盖行本身唯一丢失的情况和/或检测是否有任何行被修改。

还有QueryADataSet - 我知道的唯一“支持Data [Set | Table]上的SQL语法”的产品(尽管可能[弱]认为LINQ提供了“SQL语法”)。开发许可证每个200美元,但它可能是值得的,取决于。 (我没有隶属关系,也没有尝试过这个产品;我在试图寻找类似问题的解决方案时偶然发现了它,但最终只是改变了我的方法。)

快乐的编码。

答案 2 :(得分:0)

SELECT dtB.* FROM dtB LEFT JOIN dtA ON dtB.id=dtA.id /* AND ...  */
WHERE dtA.id IS NULL

您只能看到来自dtB的dtA中没有匹配项的行。

您可以在JOIN条件中添加任何需要相同的列作为同一行。

根据数据库的不同,可能会有更简单的方法。例如,Oracle具有MINUS关键字,用于删除完全相同的行;已修改的行仍将显示在结果中。

或者:您可以将两个Excel文件导出为文本(CSV,制表符分隔,...),前提是它们处于相同的行顺序,并使用命令行实用程序diff查看更改的内容。

可能有一个库可用于您的编程语言,它实现了diff算法,因此您可以在内存中完成所有操作。