这是修改后的问题作为对 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) ;//.Select(lst => new { table = lst.键,计数 = 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 应用程序,它获取服务器/数据库详细信息并比较表并在 datagridview 中显示差异。
目前,我正在使用 SQL 查询获取详细信息,并将结果存储在两个数据表中(一个用于源,另一个用于目标)。
我正在使用 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); }
}
……
任何帮助将不胜感激!