Lecteur XML sur une table SQL renvoyant un code XML incorrect

J'ai une table SQL qui a une colonne varchar (8) qui contient parfois des données binarys. (0x01, 0x02, etc …). (Modifier le format ou le contenu de la colonne n'est pas une option.)

Lorsque je vais dans le SQL Server 2005 Management Studio et exécutez la requête:

select * from mytable where clientID = 431620 for xml auto 

Je reçois des résultats utiles. Notez comment proc_counts est codé:

 <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 parfaitement valide, AFAIK. Maintenant, quand j'écris du code C # pour lire cette ligne, je reçois un jet d'exception pendant ReadOuterXml:

 SqlCommand cmd = new SqlCommand("select * from testing xml auto", connection); using (XmlReader xrd = cmd.ExecuteXmlReader()) { xrd.Read(); while (xrd.ReadState != ReadState.EndOfFile) { ssortingng s = xrd.ReadOuterXml(); records.Add(s); } } 

Cela renvoie: XmlException n'a pas été géré. '', la valeur hexadécimale 0x01 est un caractère invalide . Je veux le XML ci-dessus, mais je n'ai pas assez de Google-fu pour comprendre pourquoi je ne comprends pas. Suggestions?


Pour créer une table avec ce type de données, ce code Transact SQL fonctionne dans 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; 

Mise à jour: Post-mortem et solution de contournement

Dommer a probablement raison, c'est la propriété Normalization dans le XmlTextReader qui me pose des problèmes. La chose est (comme vous pouvez le voir dans les commentaires), je l'ai trouvé à peu près impossible d'aller d'un (SqlCommand).ExecuteXmlReader() à tout ce qui va me laisser aller près de la propriété Normalization d'un XmlTextReader . Souvent, la documentation de Microsoft était contradictoire ou tout simplement erronée.

Donc, je me suis installé sur une solution de contournement. Si j'utilise simplement un SqlDataReader pour absorber la sortie tout va bien. Le XML semble parfait et parsing assez bien.

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

C'est à voir avec la propriété XmlTextReader.Normalization. Cette propriété est définie sur false lorsque vous créez explicitement un XmlTextReader, de sorte que les caractères "non valides" sont décodés. Lorsque le XmlTextReader est créé implicitement, la normalisation est définie sur true.

La propriété est discutée ici:

http://msdn.microsoft.com/en-us/library/system.xml.xmltextreader.normalization.aspx

Si vous faites le traitement "manuellement" – c.-à-d. Créer un XmlTextReader – je pense que vous éviterez l'erreur.

METTRE À JOUR:

Les modifications apscopes aux versions les plus récentes du framework signifient que "XmlReaderSettings.CheckCharacters = false" peut être le path à parcourir dans ASP.NET 2.0+. Un object XmlReaderSettings peut être transmis à XmlReader.Create.

L'exception vous dit la vérité. SQL Server permet apparemment l'affichage de XML non valide. Essaye ça:

 select * from mytable where clientID = 431620 for xml auto, BINARY BASE64