繁体   English   中英

CodeGo.net>生成XML与表约束作为标签和列名作为值

[英]c# - Generate xml with table constraints as tags and column names as value

我需要生成一种类似于以下内容的XML,其中约束作为标签,列名作为c#中特定DB表的值。

<tablename>
<key>ProductId</key>
<composite>
<column>ProductId</column>
<column>ProductCode</column>
<composite>
<ForeignKey>
<column>ProductBaseId</column>
</ForeignKey>
</tablename>

有人可以帮忙吗?

在这里您将找到主键:

SELECT Col.Column_Name from 
    INFORMATION_SCHEMA.TABLE_CONSTRAINTS Tab, 
    INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE Col 
WHERE 
    Col.Constraint_Name = Tab.Constraint_Name
    AND Col.Table_Name = Tab.Table_Name
    AND Constraint_Type = 'PRIMARY KEY'
    AND Col.Table_Name = 'tablename'

如果您有多个主键,那么您将从上面的同一查询中获取它们。 您可以只计算主键,如果它们大于1,则可以在Composite中列出它们。 否则,只需将它们作为键即可。

还有一点,如果有两个主键,那么<KEY>标记中将包含什么?

在这里您将找到外键:

SELECT Col.Column_Name from 
INFORMATION_SCHEMA.TABLE_CONSTRAINTS Tab, 
INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE Col 
WHERE 
    Col.Constraint_Name = Tab.Constraint_Name
    AND Col.Table_Name = Tab.Table_Name
    AND Constraint_Type = 'FOREIGN KEY'
    AND Col.Table_Name = 'tablename'

只需合并两个信息并用XML编写即可。 XML编写非常简单,在这里可以找到它。 XML编写-DotNetPerls

更新1:这是一个代码,您可以在其中通过单个查询找到pKFK以及类型。

    SELECT Col.Column_Name, 
Case When( CHARINDEX('PK_' , Col.CONSTRAINT_NAME) >0 ) Then 'PK' ELSE 'FK' END as Type
 from 
    INFORMATION_SCHEMA.TABLE_CONSTRAINTS Tab, 
    INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE Col 
WHERE 
    Col.Constraint_Name = Tab.Constraint_Name
    AND Col.Table_Name = Tab.Table_Name
    AND (Constraint_Type = 'PRIMARY KEY'  OR Constraint_Type = 'Foreign KEY')

    AND Col.Table_Name = 'table_1'

查询输出将如下所示:

Column_Name    Type

AnotherID        FK
Code             PK
ID               PK

我知道这样做不好,我会完全提供代码。 但对我而言,这很有趣,所以我写了一些可能对其他人有帮助的行。

这是完整的代码:

    namespace XMLWritingFromDB
{
    public class Program
    {
        public static string connectionstring = "Data Source=RAHIMPC\\SQLEXPRESS;Initial Catalog=Test;Integrated Security=false;uid=******;pwd=********";
        public static SqlConnection conn;
        static void Main(string[] args)
        {

            //Get the table Informations 
            DataTable dt = GetDataSchema("table_1"); // PUT YOUR TABLE NAME HERE.
            string xmlDocument = PrepareXml(dt);
            Console.Write(xmlDocument);
            Console.ReadKey();

        }

        public static DataTable GetDataSchema(string TableName)
        {
            DataTable dt = new DataTable();
            string query = "SELECT Col.Column_Name, Case When( CHARINDEX('PK_' , Col.CONSTRAINT_NAME) >0 ) Then 'PK' ELSE 'FK' END as Type " +
                " from INFORMATION_SCHEMA.TABLE_CONSTRAINTS Tab, INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE Col " +
                " WHERE Col.Constraint_Name = Tab.Constraint_Name AND Col.Table_Name = Tab.Table_Name " +
                "AND (Constraint_Type = 'PRIMARY KEY'  OR Constraint_Type = 'Foreign KEY') AND Col.Table_Name = '"+TableName+"'";

            using (conn = new SqlConnection(connectionstring))
            {
                conn.Open();
                using (SqlCommand sc = new SqlCommand(query, conn))
                {
                    using (SqlDataReader dr = sc.ExecuteReader())
                    {
                        dt.Load(dr);
                    }
                }
                conn.Close();
            }
            return dt;
        }

        public static string PrepareXml(DataTable dt)
        {
            int pkCount = 0, fkCount = 0;
            List<string> lstPK = new List<string>();
            List<string> lstFK = new List<string>();
            //Build data for xml
            foreach (DataRow dr in dt.Rows)
            {
                if (dr[1].ToString().Contains("PK"))
                {
                    pkCount++;
                    lstPK.Add(dr[0].ToString());
                }
                if (dr[1].ToString().Contains("FK"))
                {
                    fkCount++;
                    lstFK.Add(dr[0].ToString());
                }
            }

            List<TableName> lstXml = new List<TableName>();
            TableName xml = new TableName();
            xml.key = lstPK[lstPK.Count() - 1].ToString();

            xml.ForeignKey = lstFK;
            if (pkCount > 1)
                xml.Composite = lstPK;

            var stringwriter = new System.IO.StringWriter();
            var serializer = new XmlSerializer(xml.GetType());
            serializer.Serialize(stringwriter, xml);
            return stringwriter.ToString();
        }
    }

    [XmlRoot("TableName")]
    public class TableName
    {
        public string key { get; set; }

        [XmlArray(ElementName = "Composite")]
        [XmlArrayItem("ColumnName", Type = typeof(string))]
        public List<string> Composite { get; set; }

        [XmlArray(ElementName = "ForeignKey")]
        [XmlArrayItem("ColumnName", Type = typeof(string))]
        public List<string> ForeignKey { get; set; } 

    }
}

您可以使用dataTableObject.WriteXml()方法,该方法包含各种重载。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM