【问题标题】:How to add the content of Xml files to a SQL Server database如何将 Xml 文件的内容添加到 SQL Server 数据库
【发布时间】:2013-11-18 15:03:51
【问题描述】:

我正在尝试将 .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)";

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

【问题讨论】:

  • 您在代码中的哪个位置为@input 赋值?
  • 第二个 sn-p 中无处可寻。我还尝试使用 SET @input = 'file path' 添加文件路径。
  • 从你的标签中假设你试图在 C# 中做到这一点,这不仅仅是一次性的,将 xml 转储到数据库中?
  • SQL Server 是否托管在另一个系统上?如果是这样,请记住 SQL Server 只能看到它的主机服务器的文件系统。它无法看到客户端的文件系统,除非它们是同一个系统,或者除非它是共享的。
  • 最后通过邮件(到公司总部)接收 xml 文件。必须从那里将它们插入到 sql 数据库中。

标签: c# sql xml


【解决方案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);

【讨论】:

  • 太棒了!奇迹般有效。非常感谢!
  • 您是否打算在您的 c# 代码中将其作为 sql 命令执行?只是好奇您的最终解决方案是什么,以及这是否是一次性的。
  • 是的,可以这么说。它在 c# 代码中作为 sql 命令运行。背后的想法是通过邮件接收xml文件,然后插入到sql中。
【解决方案2】:

这里的标准方法是:

  1. 拥有一个可以从 xml 填充属性的类。
  2. 通过将 xml 反序列化到对象来填充类
  3. 将对象保存到数据库中

我建议使用存储过程,因为您的内联 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 文章)。填充类后,在类中创建一个保存方法,该方法通过存储过程插入数据库。参考这个:

Call a stored procedure with parameter in c#

【讨论】:

  • 不客气。我意识到仅从代码中执行 SQL 插入命令更容易。但是,请注意,在大多数具有安全意识的公司中,我不会侥幸逃脱。但是......除了安全原因之外,如果您有机会/花时间实施像我上面提到的更强大的解决方案,还有一个额外的好处是您可以轻松地对数据做其他事情,而不仅仅是保存它。您可以轻松地将其返回到 gui,您可以删除它、更新它等。此外,如果您有其他属性,它就像添加属性一样简单。祝你好运!
猜你喜欢
  • 2014-02-17
  • 1970-01-01
  • 1970-01-01
  • 2013-03-18
  • 2016-07-03
  • 1970-01-01
  • 2010-09-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多