这是修改后的问题,作为对Alireza的回复:
a)dtResult只是一个临时表。我打算使用另一个DataTable,其结构如下(c)
所示b)如果某个项目(目标/列)在源或目标中缺失,则该项目将仅在该类别中填充。例如。如果在源中添加了一个新表,则在DataTable中,所有与源相关的列将为NULL(空白),与目标相关的列将具有数据。
c)抱歉误导。如上文a)中所述,dtResult只是一个临时表。 之后的代码如下(但是,我知道,这一切都很混乱!)
var tables = dtResult.AsEnumerable()。GroupBy(a => a [0],b => b 1)。OrderBy(b => b.Key); //。选择(lst => new {table = lst.Key,Count = lst.Count()});
dtResultClone = new DataTable();
dtResultClone.Columns.Add(new DataColumn("TableName"));
dtResultClone.Columns.Add(new DataColumn("SourceColName"));
dtResultClone.Columns.Add(new DataColumn("SourceColNo"));
dtResultClone.Columns.Add(new DataColumn("SourceColDefault"));
dtResultClone.Columns.Add(new DataColumn("SourceIsNullable"));
dtResultClone.Columns.Add(new DataColumn("SourceDataType"));
dtResultClone.Columns.Add(new DataColumn("SourceMaxLen"));
dtResultClone.Columns.Add(new DataColumn("TargetColName"));
dtResultClone.Columns.Add(new DataColumn("TargetColNo"));
dtResultClone.Columns.Add(new DataColumn("TargetColDefault"));
dtResultClone.Columns.Add(new DataColumn("TargetIsNullable"));
dtResultClone.Columns.Add(new DataColumn("TargetDataType"));
dtResultClone.Columns.Add(new DataColumn("TargetMaxLen"));
foreach (var tbl in tables)
{
string sel = "TableName='" + tbl.Key.ToString() + "'";
DataRow[] d1 = dtResult.Select(sel);
foreach (var d2 in d1)
{
drc = dtResultClone.NewRow();
drc[0] = tbl.Key.ToString();
if (d2["Difference"].ToString().Contains("Target"))
{
drc["TargetColName"] = d2["ColName"].ToString();
drc["TargetColNo"] = d2["ColNo"].ToString();
drc["TargetColDefault"] = d2["ColDefault"].ToString();
drc["TargetIsNullable"] = d2["IsNullable"].ToString();
drc["TargetDataType"] = d2["DataType"].ToString();
drc["TargetMaxLen"] = d2["MaxLen"].ToString();
}
else
{
drc["SourceColName"] = d2["ColName"].ToString();
drc["SourceColNo"] = d2["ColNo"].ToString();
drc["SourceColDefault"] = d2["ColDefault"].ToString();
drc["SourceIsNullable"] = d2["IsNullable"].ToString();
drc["SourceDataType"] = d2["DataType"].ToString();
drc["SourceMaxLen"] = d2["MaxLen"].ToString();
}
dtResultClone.Rows.Add(drc);
drc = null;
}
}
我正在编写.NET Winforms应用程序,该应用程序获取服务器/数据库详细信息并比较表并在数据网格视图中显示差异。
目前,我使用SQL查询获取详细信息并将结果存储在两个DataTable中(一个用于源,另一个用于目标)。
我使用LINQ来“除了”这两个数据表,其结果是我绑定到网格。
我的要求是显示如下结果:
但是,目前网格显示的结果如下:
代码段:
var MissingInTarget = qry1.Except(qry2); var MissingInSource = qry2.Except(qry1);
if (MissingInTarget.Any())
{
foreach (var id in MissingInTarget)
{
dr = dtResult.NewRow();
dr[0] = id.Table;
dr[1] = id.Column;
dr[2] = id.ColNo;
dr[3] = id.ColDefault;
dr[4] = id.IsNullable;
dr[5] = id.DataType;
dr[6] = id.MaxLen;
dr[7] = "In Source";
dtResult.Rows.Add(dr); }
}
...
任何帮助都会得到很高的认可!