gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 01:42:18 24 4
gpt4 key购买 nike

我想将任意 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com