【问题标题】:How to create SQL Server table schema from a XML schema? (with .NET and Visual Studio 2008)如何从 XML 架构创建 SQL Server 表架构? (使用 .NET 和 Visual Studio 2008)
【发布时间】: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


    【解决方案1】:

    您可以使用 XSD2DB 实用程序

    这是示例 xsd2db.exe -f true -l [服务器名称] -n [数据库名称] -s D:\po.xsd -t sql

    帮助链接 http://xsd2db.sourceforge.net/

    【讨论】:

      【解决方案2】:

      免责声明:我自己并没有这样做,但不久前我在考虑这样做时已将这些链接添加为书签。这家伙的 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

      【讨论】:

        【解决方案3】:

        顺便说一句,我没有得到 C# 代码的内容 由“xsd.exe”生成是值得的。

        我假设你的意思是“我不明白生成的代码有什么用”

        它生成的代码的目的是使用 .NET 中的 Microsoft 序列化子系统进行序列化。如果你创建了一个新的 XmlSerializer(typeof(GeneratedType)),那么你可以在它上面调用 Serialize() 和 Deserialze() 来去往/来自 Xml 和对象。

        在更复杂的代码生成器(例如 CodeXS)中,它会变得更加容易,因为它们会为您生成帮助器:GeneratedType.FromXML(Stream/String) 用于反序列化和 myGeneratedType.Xml 用于序列化。

        这些生成的类允许您处理已发布的模式,并且完全相信生成的符合该模式的任何 XML 都将使用这些类型进行解析和生成。您不需要做任何工作来从 XML 中获取数据(即没有 XML DOM 访问),并且您不需要三思而后行地生成与您的模式兼容的 XML。它只是工作:)

        【讨论】:

        • 谢谢,我使用了 CodeXS 生成的代码,在我看来它比“xsd.exe”生成的代码更简单易用。
        • 有什么好的教程或者地方可以下载CodeXS吗?还在维护吗?
        【解决方案4】:

        只要您能够成功解析 XML 架构,您就应该能够创建适当的数据库脚本并执行它们,从而创建您的表。

        【讨论】:

        • 但是怎么做呢?手动编写脚本?没有自动的方法吗?
        • Jader Dias:我不知道,但是这样看……无论有什么自动方式,都必须在某个时间点由某人编写。如果还没有自动解决方案,请自己编写?
        • @TXI:不必有自动映射方式,因为不必有映射。 XML 不是关系型的。
        • @John:我可以想象一种将 XML 映射到多个相关表的方法
        • @Jader:这必须适用于所有有效的 XML 模式吗?如果是这样,那你就不走运了。 XML 可以表示一些在关系数据库中无法表示的东西。如果您将自己限制在那些可以映射到关系的模式上,那么这并不难。事实上,考虑一下 VS2008 中数据集设计器创建的模式。它会愉快地忽略您手动进行的某些更改,然后重写它们以匹配最接近的关系等价物。如果你真的是认真写的,那你就倒霉了。
        【解决方案5】:

        我知道这是一个老话题,但是知道如何做到这一点对我很有帮助。或许对其他人有帮助。

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-05-19
          • 1970-01-01
          • 1970-01-01
          • 2017-03-10
          • 1970-01-01
          • 1970-01-01
          • 2014-02-12
          • 2011-09-24
          相关资源
          最近更新 更多