[英]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:这是一个代码,您可以在其中通过单个查询找到pK
和FK
以及类型。
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.