0

这是修改后的问题作为对 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); }


            }

……

任何帮助将不胜感激!

4

0 回答 0