我有一个由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中使用什么, 我该怎么用?
答案 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 Pattern的IEnumerable.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算法,因此您可以在内存中完成所有操作。