我在 MS SQL 2005 中有一个 XML 存储过程,我使用 SqlCommand.ExecuteXmlReader 获取 XmlReader,然后解析数据并形成 XML 文档。问题是 SQL 中的数据包含一些二进制字符,这些字符在 UTF-8 XML 文档中是非法的,因此会抛出异常。
有没有其他人处理过这个问题?我考虑过过滤输入到数据库中的数据,但我必须在任何地方都进行过滤,并且需要检查每个字符。
还有什么建议吗?
编辑: 数据通常存储在各种长度的 varchar 列中。数据实际上是用户在 Web 表单(ASP .NET 应用程序)上输入的。所以有时他们会从 MS Word 或其他软件中复制粘贴,然后将这些奇怪的二进制字符放入。
最佳答案
我已经看到 DotNet SqlClient 从数据库中的 nvarchar 列“打乱”数据,我们的理论认为它与“代理代码点”有关,请参阅:
http://www.siao2.com/2005/07/27/444101.aspx
http://publib.boulder.ibm.com/infocenter/iseries/v5r3/index.jsp?topic=rzaaxsurrogate.htm
SqlClient 似乎“解释”了一些字节,这意味着我们的 Xml 格式不再正确,转换为 nvarchar(max) 似乎可以阻止这种情况(尽管这确实会对性能产生影响):
SELECT CONVERT(NVARCHAR(MAX), MyValue) FROM ...
请注意,您需要使用 NVARCHAR(MAX),NVARCHAR( N ) 不起作用。
我们还发现 OleDB 提供程序也能正常工作(尽管它比 SqlClient 慢)。
关于.net - 在 .NET 中过滤非法 XML 字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/802029/