【发布时间】:2010-10-15 01:08:03
【问题描述】:
我有一个 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 可能是对的,这是 XmlTextReader 中的 Normalization 属性给我带来了问题。问题是(从 cmets 中可以看出)我发现几乎不可能从 (SqlCommand).ExecuteXmlReader() 转到任何可以让我靠近 XmlTextReader 的 Normalization 属性的东西。微软关于这方面的文档通常是矛盾的,或者完全是错误的。
所以我选择了一个解决方法。如果我只是使用SqlDataReader 来吸收输出,一切都很好。 XML 看起来很完美,解析也很好。
StringBuilder sb = new StringBuilder();
using(SqlDataReader dr = cmd.ExecuteReader())
{
while(rdr.Read())
sb.Append((string)rdr[0]);
}
【问题讨论】:
标签: c# sql sql-server xml xmlreader