2009-04-29 66 views
6

我在MS SQL 2005中有一个XML存储过程,我使用SqlCommand.ExecuteXmlReader获取XmlReader,然后解析数据并形成XML文档。问题在于SQL中的数据包含一些在UTF-8 XML文档中不合法的二进制字符,因此引发异常。在.NET中过滤非法XML字符

有没有其他人处理过这个问题?我曾考虑将输入数据过滤到数据库中,但是我必须将过滤器放在任何地方,并且每个角色都需要检查。

其他建议?

编辑: 数据通常存储在不同长度的varchar列中。数据实际上是从Web表单上的用户输入的(ASP .NET应用程序)。所以有时他们从MS Word中复制粘贴或者其他东西,它会把这些奇怪的二进制字符放入。

回答

0

我已经在应用程序中的任何地方抽象了SqlParameter对象的构造,所以我将在这一点上擦除输入。我的抽象方法创建并返回一个SqlParameter对象以用于存储过程调用。如果它是一个调用者想要的varchar,我将遍历他们想要创建的字符串的每个字符到一个SqlParameter对象中,并过滤掉那些非法的二进制XML字符。这将消除首先进入数据库的不良数据。

0

坏数据是如何进入数据库的?你在使用XML列吗?

您可以将过滤(实际上称为“验证”)放入用于将数据输入数据库的存储过程,或者可以添加触发器来检查数据,而不管数据来自何处。

一般来说,不要让不良数据进入数据库!

+0

数据是用户输入存储在数据库的varchar列中。 – 2009-04-29 13:03:59

0

这是编码问题吗?或者是XML只是畸形?如果格式不正确,我无法帮助。但对于编码......不幸的是,ExecuteXmlReader不允许您指定编码,但可以将数据视为BLOB,并使用您自己的编码分别处理它,并且XmlReader

如果数据很大,你可能想使用ExecuteReaderCommandBehavior.SequentialAccess并将其写入到一个临时文件(Path.GetTempFileName()) - 然后将该文件与XmlReader一个Stream过程。

0

您的存储过程如何生成XML?如果您使用任何的SQL Server中的XML选项,在文本字段二进制字符将被正确转义:

CREATE TABLE test (
    id int identity(1,1) not null primary key, 
    data nvarchar(50)) 
INSERT INTO test (data) values (char(0)) 
SELECT * FROM test FOR XML RAW 

生产:

<row ID="1" data="&#x0;" /> 
+0

我正在使用“For Xml Explicit” – 2009-04-30 12:21:51

1

我已经看到了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

http://publib.boulder.ibm.com/infocenter/db2luw/v8/index.jsp?topic=/com.ibm.db2.udb.doc/admin/c0004816.htm

的SqlClient似乎“解释”一些meaing是我们的XML不再是中规中矩的字节,转换为为nvarchar(最大)似乎停止这个(虽然这确实有一个性能的影响):

SELECT CONVERT(NVARCHAR(MAX), MyValue) FROM ... 

请注意,您需要使用NVARCHAR(MAX),NVARCHAR(N)不起作用。

我们还发现OleDB提供程序也正常工作(尽管它比SqlClient慢)。