C# 比较两个datatable并找出哪一列或哪一行发生了更改

C# 比较两个datatable并找出哪一列或哪一行发生了更改,c#,asp.net,C#,Asp.net,下面是我比较两个datatable的代码 <script runat="server"> protected void btnCompare_Click(object sender, EventArgs e) { System.Xml.Schema.XmlSchemaSet schemaSet = new System.Xml.Schema.XmlSchemaSet(); string fileName12 = System.IO.

下面是我比较两个datatable的代码

<script runat="server">

    protected void btnCompare_Click(object sender, EventArgs e)
    {
        System.Xml.Schema.XmlSchemaSet schemaSet = new System.Xml.Schema.XmlSchemaSet();

        string fileName12 = System.IO.Path.GetFileName(fuXSD.PostedFile.FileName);
        fuXSD.PostedFile.SaveAs(Server.MapPath("~/" + fileName12));
        string fileBasePath = Server.MapPath("~/");
        string fileName = System.IO.Path.GetFileName(this.fuXSD.FileName);
        string fullFilePath = fileBasePath + fileName;
        schemaSet.Add("http://www.w3.org/2001/XMLSchema", fullFilePath);
        schemaSet.Compile();

        System.Xml.Schema.XmlSchema xmlSchema = null;
        foreach (System.Xml.Schema.XmlSchema schema in schemaSet.Schemas())
        {
            xmlSchema = schema;
        }

        System.Data.DataSet myDS = new System.Data.DataSet();
        myDS.ReadXmlSchema(fuXSD.PostedFile.InputStream);

        System.Data.DataTable dt1 = new System.Data.DataTable();
        dt1.Columns.Add("TableName", Type.GetType("System.String"));
        dt1.Columns.Add("ColumnName", Type.GetType("System.String"));
        dt1.Columns.Add("Datatype", Type.GetType("System.String"));
        dt1.Columns.Add("Length", Type.GetType("System.String"));

        foreach (object item in xmlSchema.Items)
        {
            System.Xml.Schema.XmlSchemaElement schemaElement = item as System.Xml.Schema.XmlSchemaElement;
            System.Xml.Schema.XmlSchemaComplexType complexType = item as System.Xml.Schema.XmlSchemaComplexType;

            if (schemaElement != null)
            {
                System.Xml.Schema.XmlSchemaType schemaType = schemaElement.SchemaType;
                System.Xml.Schema.XmlSchemaComplexType schemaComplexType = schemaType as System.Xml.Schema.XmlSchemaComplexType;

                if (schemaComplexType != null)
                {
                    System.Xml.Schema.XmlSchemaParticle particle = schemaComplexType.Particle;
                    System.Xml.Schema.XmlSchemaSequence sequence = particle as System.Xml.Schema.XmlSchemaSequence;

                    if (sequence != null)
                    {
                        foreach (System.Xml.Schema.XmlSchemaElement childElement in sequence.Items)
                        {
                            if (childElement != null)
                            {
                                System.Xml.Schema.XmlSchemaType schemaType2 = childElement.SchemaType;
                                System.Xml.Schema.XmlSchemaSimpleType schemaSimpleType = schemaType2 as System.Xml.Schema.XmlSchemaSimpleType;
                                System.Xml.Schema.XmlSchemaSimpleTypeRestriction restriction = schemaSimpleType.Content as System.Xml.Schema.XmlSchemaSimpleTypeRestriction;

                                if (restriction != null)
                                {
                                    if (restriction.BaseTypeName.Name != null)
                                    {
                                        foreach (System.Xml.Schema.XmlSchemaObject facet in restriction.Facets)
                                        {
                                            string facetvalue = "";
                                            if (restriction.BaseTypeName.Name.ToLower() == "datetime")
                                            {
                                                facetvalue = "";
                                            }
                                            else
                                            {
                                                facetvalue = ((System.Xml.Schema.XmlSchemaFacet)facet).Value;
                                            }

                                            if (facet is System.Xml.Schema.XmlSchemaMaxLengthFacet || facet is System.Xml.Schema.XmlSchemaMinInclusiveFacet)
                                            {
                                                dt1.Rows.Add(schemaElement.Name, childElement.Name, restriction.BaseTypeName.Name, facetvalue);

                                                //Response.Write(dt);
                                                //Response.Write(schemaElement.Name + " : " + childElement.Name + " : " + restriction.BaseTypeName.Name + " : " + facetvalue + "<br />");
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }



        System.Data.DataTable dt2 = new System.Data.DataTable();
        dt2.Columns.Add("TableName", Type.GetType("System.String"));
        dt2.Columns.Add("ColumnName", Type.GetType("System.String"));
        dt2.Columns.Add("Datatype", Type.GetType("System.String"));
        dt2.Columns.Add("Length", Type.GetType("System.String"));

        var reader = new System.IO.StreamReader(fuCSV.PostedFile.InputStream);
        reader.ReadLine();
        while (reader.Peek() != -1)
        {
            var line = reader.ReadLine();
            var values = line.Split(',');

            dt2.Rows.Add(values[0], values[1], values[2], values[3]);

            //Response.Write(dt);
            //Response.Write(values[0] + " " + values[1] + " " + values[2] + " " + values[3] + "<br />");
        }

        ////// Compare Both //////



        dt1.TableName = "FirstTable";
        dt2.TableName = "SecondTable";

        //Create Empty Table
        System.Data.DataTable table = new System.Data.DataTable("Difference");

        try
        {
            //Must use a Dataset to make use of a DataRelation object
            using (System.Data.DataSet ds = new System.Data.DataSet())
            {
                ds.Tables.AddRange(new System.Data.DataTable[] { dt1.Copy(), dt2.Copy() });


                //Get Columns for DataRelation

                System.Data.DataColumn[] firstcolumns = new System.Data.DataColumn[ds.Tables[0].Columns.Count];
                for (int i = 0; i < firstcolumns.Length; i++)
                {
                    firstcolumns[i] = ds.Tables[0].Columns[i];
                }
                System.Data.DataColumn[] secondcolumns = new System.Data.DataColumn[ds.Tables[1].Columns.Count];
                for (int i = 0; i < secondcolumns.Length; i++)
                {
                    secondcolumns[i] = ds.Tables[1].Columns[i];
                }

                //Create DataRelation

                System.Data.DataRelation r = new System.Data.DataRelation(string.Empty, firstcolumns, secondcolumns, false);
                ds.Relations.Add(r);
                for (int i = 0; i < dt1.Columns.Count; i++)
                {
                    table.Columns.Add(dt1.Columns[i].ColumnName, dt1.Columns[i].DataType);
                }
                table.Columns.Add("Message", typeof(string));
                table.BeginLoadData();

                foreach (System.Data.DataRow parentrow in ds.Tables[0].Rows)
                {

                    System.Data.DataRow[] childrows = parentrow.GetChildRows(r);
                    if (childrows == null || childrows.Length == 0)
                        table.LoadDataRow(parentrow.ItemArray, true);


                }
                table.EndLoadData();
            }
        }
        catch (Exception ex)
        {
            throw ex;
        }

        Response.Write(table);

        GVDifference.DataSource = table;
        GVDifference.DataBind();
    }

</script>


<html>
<head runat="server">
    <meta name="viewport" content="width=device-width" />
    <title></title>
</head>
<body>
    <form runat="server">
        <div>
            <asp:GridView ID="dataGridView1" runat="server"></asp:GridView>
            <asp:FileUpload ID="fuXSD" runat="server" />
            <br />
            <asp:FileUpload ID="fuCSV" runat="server" />
            <br />
            <asp:Button ID="btnCompare" runat="server" OnClick="btnCompare_Click" Text="Compare" />
            <asp:GridView ID="GVDifference" runat="server"></asp:GridView>
        </div>
    </form>
</body>
</html>
给出了另一个datatable结果:

TableName       ColumnName      Datatype    Length
CDS_CLHC_TEMP   CLCL_ID         string       12
CDS_CLHC_TEMP   CLHC_COND_CDPS  string        2
CDS_CLHC_TEMP   CLHC_COND_CD2   Varchar       2 
CDS_CLHC_TEMP   CLHC_COND_CD3   string        2
现在,当我比较这两个数据表时,我得到了精确的更改结果,但如下所示:

TableName       ColumnName      Datatype    Length  Message
CDS_CLHC_TEMP1  CLCL_ID         string       12
CDS_CLHC_TEMP   CLHC_COND_CDPS  string        2
CDS_CLHC_TEMP   CLHC_COND_CD2   Varchar       2 

在上面的表中,我想得到表更改或列更改的例子。在第一列中,CDS_CLHC_TEMP1已更改,因此它应该显示表名更改。

我认为您应该使用foreach循环实现这一点,并比较两个数据表行。您可以为我推荐相应的代码吗?
TableName       ColumnName      Datatype    Length  Message
CDS_CLHC_TEMP1  CLCL_ID         string       12
CDS_CLHC_TEMP   CLHC_COND_CDPS  string        2
CDS_CLHC_TEMP   CLHC_COND_CD2   Varchar       2