У меня есть таблица 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-фу, чтобы понять, почему я его не получаю. Предложения?
Чтобы создать таблицу с данными такого типа, этот код 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;
Обновление: вскрытие и обходной путь
Доммер, вероятно, прав, что именно свойство Normalization
в XmlTextReader
вызывает у меня проблемы. Дело в том (как вы можете видеть из комментариев), я обнаружил, что практически невозможно перейти от (SqlCommand).ExecuteXmlReader()
к чему-либо, что позволит мне приблизиться к свойству Normalization
XmlTextReader
. Часто документация Microsoft по этому вопросу была противоречивой или просто неверной.
Итак, я остановился на обходном пути. Если я просто использую SqlDataReader
, чтобы впитать вывод, все в порядке. XML выглядит отлично и довольно хорошо разбирает.
StringBuilder sb = new StringBuilder();
using(SqlDataReader dr = cmd.ExecuteReader())
{
while(rdr.Read())
sb.Append((string)rdr[0]);
}