我想将任意 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 aString
!)
另见
最佳答案
您必须使用 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/