我有一个SQL表,它有一个varchar(8)列,其中偶尔包含二进制数据。(0x01,0x02等)(更改列的格式或内容不是选项。)
当我进入SQLServer2005ManagementStudio并运行查询时:
select *
from mytable
where clientID = 431620
for xml auto我得到了有用的结果。注意proc_counts是如何编码的:
<mytable clientID="431620" recno="19014235" pdate="2008-03-04T00:00:00"
proc_counts="" otherstuff="foobar"
date="2008-02-17T00:00:00"/>完全有效的XML,AFAIK。现在,当我实际编写C#代码来读取这一行时,会在ReadOuterXml期间抛出异常:
SqlCommand cmd = new SqlCommand("select * from testing xml auto", connection);
using (XmlReader xrd = cmd.ExecuteXmlReader())
{
xrd.Read();
while (xrd.ReadState != ReadState.EndOfFile)
{
string s = xrd.ReadOuterXml();
records.Add(s);
}
}此抛出:XmlException未被处理。'',十六进制值0x01是无效字符。我需要上面的XML,但是没有足够的Google-fu来找出为什么我没有得到它。有什么建议吗?
若要使用此类数据创建表,此Transact SQL代码在SSMS中工作:
create table testing
(clientid int, proc_counts varchar(8));
insert into testing values (1, 'normal');
insert into testing values (2, char(65) + char(1) + char(65));
select * from testing for xml auto;更新:死后和解决问题
Dommer可能是对的,是XmlTextReader中的XmlTextReader属性给我带来了问题。问题是(正如您可以从评论中看到的),我发现几乎不可能从(SqlCommand).ExecuteXmlReader()到任何允许我接近XmlTextReader的Normalization属性的东西。关于这一点的Microsoft文档常常是矛盾的,或者是完全错误的。
所以我决定找个解决办法。如果我只是使用一个SqlDataReader来吸收输出,那么一切都很好。XML看起来很完美,并且分析得很好。
StringBuilder sb = new StringBuilder();
using(SqlDataReader dr = cmd.ExecuteReader())
{
while(rdr.Read())
sb.Append((string)rdr[0]);
}发布于 2009-03-23 19:07:48
这与XmlTextReader.Normalization属性有关。在显式创建XmlTextReader时,此属性设置为false,因此对“无效”字符进行解码。当隐式创建XmlTextReader时,规范化设置为true。
该属性在这里讨论:
http://msdn.microsoft.com/en-us/library/system.xml.xmltextreader.normalization.aspx
如果您进行“手动”处理--即创建一个XmlTextReader --我认为您将避免错误。
更新:
框架的最新版本中的更改意味着"XmlReaderSettings.CheckCharacters = false“可能是ASP.NET 2.0+的发展方向。XmlReaderSettings对象可以传递给XmlReader.Create。
发布于 2009-03-23 18:46:11
例外是告诉你真相。Server显然允许显示无效的XML。试试这个:
select * from mytable where clientID = 431620 for xml auto, BINARY BASE64https://stackoverflow.com/questions/674603
复制相似问题