2

時々バイナリデータを含む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="&#x1;&#x1;&#x2;&#x1;" 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のドキュメントは矛盾しているか、まったく間違っていました。NormalizationXmlTextReader

そこで、回避策を決定しました。単にSqlDataReader出力を吸収するためにを使用する場合、すべてが正常です。XMLは完璧に見え、非常にうまく解析されます。

StringBuilder sb = new StringBuilder();
using(SqlDataReader dr = cmd.ExecuteReader())
{
    while(rdr.Read())
        sb.Append((string)rdr[0]);
}
4

2 に答える 2

4

これは、XmlTextReader.Normalization プロパティと関係があります。XmlTextReader を明示的に作成すると、このプロパティは false に設定されるため、「無効な」文字はデコードされます。XmlTextReader が暗黙的に作成されると、Normalization が 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-23T19:07:48.260 に答える
1

例外は、あなたに真実を伝えることです。SQL Server は明らかに無効な XML の表示を許可しています。これを試して:

select *  from mytable  where clientID = 431620 for xml auto, BINARY BASE64
于 2009-03-23T18:46:11.557 に答える