[英]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.Except的ExceptRows設置模式 。 如果該行包含一些“唯一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.