sql-server - .NET : How to insert XML document into SQL Server

标签 sql-server xml sql-server-2008 ado.net xml-serialization

我想将任意 XML 插入到 SQL Server 中。 XML 包含在 XmlDocument 中对象。

我要插入的列是 nvarchar , ntext , 或 xml列(如果它让您的生活更轻松,那么您可以选择它的类型。实际上它是一个 xml 列。)

原型(prototype)

void SaveXmlToDatabase(DbConnection connection,
      XmlDocument xmlToSave,
      String tableName, String columnName);
{

}

我问的原因是因为我试图找到正确的方法来打开 XmlDocument变成数据库可以接受的东西——确保编码正确:

  • 我必须确保在插入过程中使用的编码与数据库采用的编码相匹配
  • 我必须同步 <?xml version="1.0" encoding="windows-1252"?>元素

我知道ntext , nvarchar , 或 xml存储为 UTF-16 SQL Server 内部。所以我必须确保将数据以 UTF-16 格式提供给 SQL Server。这不是 String 的问题.NET 中的 s,因为它们 unicode UTF-16。

第二个问题,同步编码属性,是一个更难解决的问题。我必须弄清楚如何通过 XmlDocument 找到声明元素对象:

<?xml version="1.0" encoding="windows-1252"?>   (or whatever the encoding may be)

并调整为UTF-16

<?xml version="1.0" encoding="UTF-16"?>

我天真的尝试(失败了)

忽略 XML 声明中的编码,只是弄清楚如何将任何内容保存到 SQL Server 中:

void SaveXmlToDatabase(DbConnection connection,
      XmlDocument xmlToSave,
      String tableName, String columnName);
{
   String sql = "INSERT INTO "+tableName+" ("+columnName+") 
          VALUES ('"+xmlToSave.ToString()+"')";

   using (DbCommand command = connection.CreateCommand())
   {
      command.CommandText = sql;

      DbTransaction trans = connection.BeginTransaction();
      try
      {
         command.ExecuteNonQuery();
         trans.Commit();
      }
      catch (Exception)
      {
         trans.Rollback();
         throw;
      }
   }
}

失败是因为 sql我尝试运行的是:

INSERT INTO LiveData (RawXML) 
VALUES ('System.Xml.XmlDocument')

这是因为 XmlDocument.ToString()返回“System.Xml.XmlDocument”。偷看一下实现,它看到它实际上是在调用:

this.GetType().ToString();

Aside: Microsoft seems to have gone out of their way to prevent you from getting the Xml as a string - presumably because it leads to bugs (But they don't tell us what bugs, why they're bugs, or the right way to convert an XmlDocument into a String!)

另见

最佳答案

您必须使用 SqlParameter。 我建议这样做:

command.Parameters.Add(
   new SqlParameter("@xml", SqlDbType.Xml) 
       {Value = new SqlXml(new XmlTextReader(xmlToSave.InnerXml
                       , XmlNodeType.Document, null)) })

SQL 应该是这样的:

String sql = "INSERT INTO "+tableName+" ("+columnName+") VALUES (@xml)";

并且由于第一个子节点始终是 xml 节点,您可以使用以下语句替换编码。

xmlToSave.FirstChild.InnerText = "version=\"1.0\" encoding=\"UTF-16\"";

总而言之,它看起来像这样:

void SaveXmlToDatabase(DbConnection connection,
      XmlDocument xmlToSave,
      String tableName, String columnName);
{
   String sql = "INSERT INTO "+tableName+" ("+columnName+") VALUES (@xml)";

   using (DbCommand command = connection.CreateCommand())
   {
      xmlToSave.FirstChild.InnerText = "version=\"1.0\" encoding=\"UTF-16\"";             
      command.CommandText = sql;
      command.Parameters.Add(
        new SqlParameter("@xml", SqlDbType.Xml) 
           {Value = new SqlXml(new XmlTextReader(xmlToSave.InnerXml
                       , XmlNodeType.Document, null)) });


      DbTransaction trans = connection.BeginTransaction();
      try
      {
         command.ExecuteNonQuery();
         trans.Commit();
      }
      catch (Exception)
      {
         trans.Rollback();
         throw;
      }
   }
}

关于sql-server - .NET : How to insert XML document into SQL Server,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3574836/

相关文章:

ios - 从 iOS Swift 中的 xml 文本文件中提取 Json

python - 在 python 中解析一个大的 (~40GB) XML 文本文件

sql-server - 暂时暂停 SQL Server 复制

sql-server - 如何使ElasticSearch集群与数据库同步?

c# - SQL Server 和 C# 的输出不同

sql - 如何在 SQL Server 中生成日期范围

sql - 更新和替换字符串的一部分

SQL Server - SQL 级联更改列的数据类型

sql-server - 存储过程中返回值 0 总是成功吗?

java - 从 Android 上的 night 文件夹中获取颜色