比较两个数据库模式中的表 - SQL Server 2008

时间:2013-09-25 06:41:13

标签: .net linq sql-server-2008 compare schema

这是修改后的问题,作为对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来“除了”这两个数据表,其结果是我绑定到网格。

我的要求是显示如下结果:

enter image description here

但是,目前网格显示的结果如下:

enter image description here

代码段:

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); }


            }

...

任何帮助都会得到很高的认可!

0 个答案:

没有答案