我有一个 SQL 表,它有一个 varchar(8) 列,其中偶尔有二进制数据。(0x01、0x02 等...)。(更改列的格式或内容不是一种选择。)
当我进入 SQL Server 2005 Management Studio 并运行查询时:
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 可能是对的,这是给我带来问题的Normalization
财产。XmlTextReader
问题是(正如您从评论中看到的那样)我发现几乎不可能从 a(SqlCommand).ExecuteXmlReader()
转到任何可以让我靠近Normalization
an 属性的东西XmlTextReader
。通常,Microsoft 关于此的文档是矛盾的,或者完全是错误的。
所以我决定了一个解决方法。如果我只是使用 anSqlDataReader
来吸收输出,一切都很好。XML 看起来很完美,解析也很好。
StringBuilder sb = new StringBuilder();
using(SqlDataReader dr = cmd.ExecuteReader())
{
while(rdr.Read())
sb.Append((string)rdr[0]);
}