如何将Xml文件的内容添加到SQL Server数据库

时间:2013-11-18 15:03:51

标签: c# sql xml

我正在尝试将.xml数据插入到Sql Server数据库中。

硬编码作品 - >

        string strSQL = @"
        DECLARE @input XML = '<Mitarbeiter><Mitarbeiter><ID>6000</ID><Vorname>Ulli</Vorname><Nachname>Unfassbar</Nachname><Gehalt>2000</Gehalt></Mitarbeiter></Mitarbeiter>' 

        INSERT INTO Mitarbeiter(ID, Vorname, Nachname, Gehalt)

        SELECT                          
        XEmp.value('(ID)[1]', 'int'),
        XEmp.value('(Vorname)[1]', 'varchar(50)'),
        XEmp.value('(Nachname)[1]', 'varchar(50)'),
        XEmp.value('(Gehalt)[1]', 'int')
        FROM 
        @input.nodes('/Mitarbeiter/Mitarbeiter') AS XTbl(XEmp)";

...但这应该适用于.xml文件。我试图添加文件路径,但没有成功。这是我添加文件路径的方式。

        string strSQL = @"

        DECLARE @input XML

        SELECT @xml = XTbl.XEmp

        FROM OPENROWSET( BULK 'C:\TestMail.xml', SINGLE_CLOB ) XTbl(XEmp)
        INSERT INTO Mitarbeiter(ID, Vorname, Nachname, Gehalt)

        SELECT
        XEmp.value('(ID)[1]', 'int'),
        XEmp.value('(Vorname)[1]', 'varchar(50)'),
        XEmp.value('(Nachname)[1]', 'varchar(50)'),
        XEmp.value('(Gehalt)[1]', 'int')

        FROM 
        @input.nodes('/Mitarbeiter/Mitarbeiter') AS XTbl(XEmp)";

有什么想法吗? 感谢您提前提供任何帮助!

2 个答案:

答案 0 :(得分:1)

修复变量名后,它可以在我的服务器上运行:

DECLARE @input XML

SELECT @input = XTbl.XEmp
FROM OPENROWSET(BULK 'C:\Testmail.xml', SINGLE_CLOB) XTbl(XEmp);

INSERT INTO Mitarbeiter (ID, Vorname, Nachname, Gehalt)
SELECT XEmp.value('(ID)[1]', 'int'), XEmp.value('(Vorname)[1]', 'varchar(50)'), XEmp.value('(Nachname)[1]', 'varchar(50)'), XEmp.value('(Gehalt)[1]', 'int')
FROM @input.nodes('/Mitarbeiter/Mitarbeiter') AS XTbl(XEmp);

答案 1 :(得分:1)

这里的标准方法是:

  1. 有一个具有可以从xml填充的属性的类。
  2. 通过将xml解除对象
  3. 来填充类
  4. 将对象保存到数据库
  5. 我建议使用存储过程,因为你的内联sql方法是一种不好的做法,容易受到sql注入攻击,并且很难进行故障排除和维护。

    我建议从这里开始学习序列化/反序列化: http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlserializer(v=vs.110).aspx

    此外,如果您拥有XML的XSD,则可以快速创建与xml匹配的类(参考:What is the difference between XML and XSD?)。我认为您的XSD看起来像这样:

    <xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
      <xs:element name="Mitarbeiter">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="Mitarbeiter">
              <xs:complexType>
                <xs:sequence>
                  <xs:element type="xs:short" name="ID"/>
                  <xs:element type="xs:string" name="Vorname"/>
                  <xs:element type="xs:string" name="Nachname"/>
                  <xs:element type="xs:short" name="Gehalt"/>
                </xs:sequence>
              </xs:complexType>
            </xs:element>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    </xs:schema>
    

    将上述xsd保存为.xsd文件。打开Visual Studio命令提示符并输入以下命令:

    xsd your.xsd /classes
    

    这将为您创建一个类并节省大量的输入。使用xml通过对xml文件进行解除封装来填充您的类(参考上面的msdn文章)。填充类后,在类中创建一个save方法,该方法通过存储过程插入到数据库中。参考这个:

    Call a stored procedure with parameter in c#