【发布时间】:2010-08-26 11:59:37
【问题描述】:
我想将任意 XML 插入 SQL Server。 XML 包含在 XmlDocument 对象中。
我要插入的列是nvarchar、ntext 或xml 列(如果它使您的生活更轻松,那么您可以选择它是哪种类型。真的是xml 列。)
原型
void SaveXmlToDatabase(DbConnection connection,
XmlDocument xmlToSave,
String tableName, String columnName);
{
}
我问的原因是因为我正在尝试找到将XmlDocument 转换为数据库可以采用的正确方法 - 确保编码正确:
- 我必须确保插入期间使用的编码与数据库采用的编码相匹配
- 我必须同步
<?xml version="1.0" encoding="windows-1252"?>元素
我知道 ntext、nvarchar 或 xml 在 SQL Server 中存储为 UTF-16。所以我必须确保将数据以 UTF-16 格式提供给 SQL Server。这对于 .NET 中的 Strings 来说不是问题,因为它们是 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();
旁白:微软似乎已经竭尽全力阻止你 从获取 Xml 作为字符串 - 大概是因为它会导致错误 (但他们没有告诉我们什么错误,为什么 它们是错误,或者是正确的方法 将
XmlDocument转换为String!)
另见
【问题讨论】:
-
这个问题可能相关:stackoverflow.com/questions/574928/…
标签: sql-server xml sql-server-2008 ado.net xml-serialization