簡體   English   中英

如何比較兩個數據表

[英]How do I compare two datatables

我有一個數據表,它將包含72列。

我將使用VSTO將其下載到excel工作表中,效果很好。

現在,用戶將更改這些行之一或所有這些行,還將插入一個新行。

考慮首先下載的數據表是dtA,而在excel工作表中已修改的數據表是dtB。

我想比較dtA和dtB。

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

我不能為每一行放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中使用什么,我應該使用pls?

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

也許可以選擇LINQ for DataSet (這僅表示DataSet支持LINQ並且是.NET 3.5+框架的一部分)。 特別是,檢查僅使用IEnumerable.ExceptExceptRows設置模式 如果該行包含一些“唯一ID”,這是最簡單的方法,但它足以涵蓋該行本身唯一丟失和/或檢測是否有任何行被修改的情況。

還有QueryADataSet -我知道的唯一產品“在Data [Set | Table]上支持SQL語法”(盡管可能[弱]認為LINQ提供了“ SQL語法”)。 開發許可證的價格是200美元,但這可能是值得的,具體取決於。 (我沒有從屬關系,也沒有嘗試過該產品;在嘗試找到類似問題的解決方案時偶然發現了它,但最終只是改變了我的方法。)

快樂的編碼。

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算法,因此您可以在內存中完成所有操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM