尝试将XML内容存储到SQL Server 2005失败(编码问题)

伙计们,

我有一个web服务,返回ISO-8859-1编码的数据 – 因为它不是我的,我无法改变:-(

出于审计目的,我想将这些调用生成的XML存储到SQL Server 2005表中,其中我有一个类型为“XML NULL”的字段。

从我的C#代码中,我尝试使用参数化查询将此XML内容存储到XML字段中,例如

SqlCommand _cmd = new SqlCommand("INSERT INTO dbo.AuditTable(XmlField) VALUES(@XmlContents)", _connection); _cmd.Parameters.Add("@XmlContents", SqlDbType.Xml); _cmd.Parameters["@XmlContents"].Value = (my XML response); _cmd.ExecuteNonQuery(); 

麻烦的是 – 当我运行此代码时,我收到一个错误:

Msg 9402,Level 16,State 1,Line 1
XML解析:第1行,字符xy,无法切换编码

?? 我试图弄清楚我可以在哪里以及如何“切换”编码 – 到目前为止没有运气。 这究竟意味着什么? 我无法在SQL Server 2005中使用ISO-8859-1编码存储XML? 或者有一个技巧:a)告诉SQL Server 2005只接受这种编码,或者b)在存储到SQL Server之前自动将webservice响应转换为UTF编码?

感谢任何提示,指示,提示! 渣

你需要转换为utf-16

我不是SQL Server中的XML专家,即使我使用它,但去年我们遇到了同样的问题,而且与发送的xml相比,它在SQL中声明的字符串数据类型不匹配。

我在谷歌上发现了这个。 http://social.msdn.microsoft.com/forums/en-US/sqlxml/thread/d40ef582-4ffe-4f4b-b6b8-03c6c0ba1a32/

我想你可以换掉这条线

 _cmd.Parameters.Add("@XmlContents", SqlDbType.Xml); 

 _cmd.Parameters.Add("@XmlContents", System.Data.SqlTypes.SqlXml); 

您是否可以将xml重新编写为unicode(可能是一个MemoryStream )并发送? 注意:如果您只是存储数据,则可以使用varbinary(max) (实际上它会更快)。 这没有编码困难,并且还允许您审核您收到的任何损坏的xml。

如果你在数据库服务器中查询数据为xml,那么xml显然是要走的路。

编辑
我错过了问题的ISO-8859-1部分 – 下面的解决方案对UTF8有好处,但显然不能解决Marc的问题,因为他无法改变编码。


这是我使用的解决方案:

  • 将XML插入SQL数据库

以及上面代码的略微修改版本(我使用SQL 2005使用UTF8文件对其进行了测试):

 using System.IO; using System.Text; using System.Data; using System.Data.SqlClient; using System.Data.SqlTypes; ... using (SqlConnection connection = new SqlConnection("conn string")) { connection.Open(); string sql = "INSERT INTO mytable (xmlColumn) VALUES (@xmlData)"; using (SqlCommand command = new SqlCommand(sql, connection)) { // Swap round if the source file is unicode string xml = File.ReadAllText(@"C:\myxml.xml"); //string xml = File.ReadAllText(@"C:\myxml.xml", Encoding.Unicode); using (MemoryStream stream = new MemoryStream()) { using (StreamWriter writer = new StreamWriter(stream, Encoding.Unicode)) { writer.Write(xml); writer.Flush(); stream.Position = 0; SqlParameter parameter = new SqlParameter("@xmlData", SqlDbType.Text); parameter.Value = new SqlXml(stream); command.Parameters.Add(parameter); command.ExecuteNonQuery(); } } } } 

甚至在将xml内容插入db时我遇到了类似的问题。 例如,输入是这样的:

 Insert Into TestData(Xml) Values ('') 

这种语句曾经失败,我得到“无法切换..”错误。 后来我简单地将N加到xml字符串中,如下所示:

 Insert Into TestData(Xml) Values (N'') 

在此之后它开始工作!