【发布时间】:2009-06-17 19:44:54
【问题描述】:
我有一个 XML 架构,并且我知道“xsd.exe”可以为其生成 C# 代码。但我想知道是否可以借助此工具或其他工具从 XSD 自动创建 MS SQL Server 2005+ 表。
顺便说一句我没有得到“xsd.exe”生成的C#代码的价值。
CodeXS生成的代码和xsd.exe有什么区别?
【问题讨论】:
标签: c# .net sql-server xml sql-server-2005
我有一个 XML 架构,并且我知道“xsd.exe”可以为其生成 C# 代码。但我想知道是否可以借助此工具或其他工具从 XSD 自动创建 MS SQL Server 2005+ 表。
顺便说一句我没有得到“xsd.exe”生成的C#代码的价值。
CodeXS生成的代码和xsd.exe有什么区别?
【问题讨论】:
标签: c# .net sql-server xml sql-server-2005
您可以使用 XSD2DB 实用程序
这是示例 xsd2db.exe -f true -l [服务器名称] -n [数据库名称] -s D:\po.xsd -t sql
【讨论】:
免责声明:我自己并没有这样做,但不久前我在考虑这样做时已将这些链接添加为书签。这家伙的 T-SQL 通常很出色,所以我强烈推荐它:
http://weblogs.sqlteam.com/peterl/archive/2009/03/05/Extract-XML-structure-automatically.aspx
http://weblogs.sqlteam.com/peterl/archive/2009/06/04/Extract-XML-structure-automatically-part-2.aspx
【讨论】:
顺便说一句,我没有得到 C# 代码的内容 由“xsd.exe”生成是值得的。
我假设你的意思是“我不明白生成的代码有什么用”
它生成的代码的目的是使用 .NET 中的 Microsoft 序列化子系统进行序列化。如果你创建了一个新的 XmlSerializer(typeof(GeneratedType)),那么你可以在它上面调用 Serialize() 和 Deserialze() 来去往/来自 Xml 和对象。
在更复杂的代码生成器(例如 CodeXS)中,它会变得更加容易,因为它们会为您生成帮助器:GeneratedType.FromXML(Stream/String) 用于反序列化和 myGeneratedType.Xml 用于序列化。
这些生成的类允许您处理已发布的模式,并且完全相信生成的符合该模式的任何 XML 都将使用这些类型进行解析和生成。您不需要做任何工作来从 XML 中获取数据(即没有 XML DOM 访问),并且您不需要三思而后行地生成与您的模式兼容的 XML。它只是工作:)
【讨论】:
只要您能够成功解析 XML 架构,您就应该能够创建适当的数据库脚本并执行它们,从而创建您的表。
【讨论】:
我知道这是一个老话题,但是知道如何做到这一点对我很有帮助。或许对其他人有帮助。
More advanced examples can be seen at Microsoft page.
因此,可以从 XSD 手动创建 SQL 表。例如,我们有以下 xml:
<?xml version="1.0" encoding="UTF-8"?>
<foo>
<row>
<CAR_NUM>624</CAR_NUM>
<CAR_ORDER>1</CAR_ORDER>
</row>
<row>
<CAR_NUM>623</CAR_NUM>
<CAR_ORDER>2</CAR_ORDER>
</row>
<row>
<CAR_NUM>681</CAR_NUM>
<CAR_ORDER>3</CAR_ORDER>
</row>
<row>
<CAR_NUM>625</CAR_NUM>
<CAR_ORDER>4</CAR_ORDER>
</row>
<row>
<CAR_NUM>680</CAR_NUM>
<CAR_ORDER>5</CAR_ORDER>
</row>
</foo>
所以 XSD 将如下所示:
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:sql="urn:schemas-microsoft-com:mapping-schema">
<xsd:element name="row" sql:relation="CAR"
sql:key-fields="CAR_NUM">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="CAR_NUM" type="xsd:integer" />
<xsd:element name="CAR_ORDER" type="xsd:integer" />
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
SQL 表将如下所示:
CREATE TABLE CAR (
CAR_NUM INT ,
CAR_ORDER INT
GO
然后您可以使用Interop.SQLXMLBULKLOADLib 库将数据加载到SQLServer:
try
{
var xmlFileName = @".your address here..\GetInformReplyEdited.xml";
var xsdScheme = @".your address here..\scheme.xsd";
var connString = "Provider=sqloledb;server=yourServer;database=Test;integrated security=SSPI";
SQLXMLBULKLOADLib.SQLXMLBulkLoad4Class objBL = new SQLXMLBULKLOADLib.SQLXMLBulkLoad4Class
{
ConnectionString = connString,
ErrorLogFile = "error.xml",
KeepIdentity = false
};
objBL.Execute(xsdScheme, xmlFileName);
}
catch (Exception e)
{
Console.WriteLine(e.ToString());
}
【讨论】: