時々バイナリデータを含むvarchar(8)列を持つSQLテーブルがあります。(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は処理されませんでした。''、16進値0x01は無効な文字です。上からXMLが欲しいのですが、なぜそれが得られないのかを理解するのに十分なGoogle-fuがありません。提案?
この種のデータを使用してテーブルを作成するために、このTransactSQLコードは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()
近くに行くことを可能にする何かに行くことはほとんど不可能であることがわかりました。多くの場合、これに関するMicrosoftのドキュメントは矛盾しているか、まったく間違っていました。Normalization
XmlTextReader
そこで、回避策を決定しました。単にSqlDataReader
出力を吸収するためにを使用する場合、すべてが正常です。XMLは完璧に見え、非常にうまく解析されます。
StringBuilder sb = new StringBuilder();
using(SqlDataReader dr = cmd.ExecuteReader())
{
while(rdr.Read())
sb.Append((string)rdr[0]);
}