La tentative de stockage de contenu XML dans SQL Server 2005 échoue (problème de codage)

Gens,

J’ai un service Web qui renvoie les données au format ISO-8859-1. Comme ce n’est pas le mien, je ne peux pas changer cela 🙁

À des fins d’audit, j’aimerais stocker le XML résultant de ces appels dans une table SQL Server 2005, dans laquelle j’ai un champ de type “XML NULL”.

A partir de mon code C #, j’essaie de stocker ce contenu XML dans le champ XML à l’aide d’une requête paramétrée, quelque chose comme:

SqlCommand _cmd = new SqlCommand("INSERT INTO dbo.AuditTable(XmlField) VALUES(@XmlContents)", _connection); _cmd.Parameters.Add("@XmlContents", SqlDbType.Xml); _cmd.Parameters["@XmlContents"].Value = (my XML response); _cmd.ExecuteNonQuery(); 

Le problème est que lorsque je lance ce code, je récupère une erreur:

Msg 9402, Niveau 16, Etat 1, Ligne 1
Analyse XML: ligne 1, caractère xy, impossible de basculer le codage

?? J’essayais de comprendre où et comment je pourrais éventuellement “changer” l’encodage – pas de chance jusqu’à présent. Qu’est-ce que cela signifie vraiment? Je ne peux pas stocker de code XML avec l’encodage ISO-8859-1 dans SQL Server 2005 ?? Ou y a-t-il une astuce pour a) indiquer à SQL Server 2005 d’accepter simplement cet encodage ou b) pour convertir automatiquement la réponse du service Web en encodage UTF avant de la stocker dans SQL Server?

Merci pour toutes les astuces, pointeurs, astuces! Marc

Vous devez convertir en utf-16

Même si je l’utilise, je ne suis pas un expert en XML dans SQL Server, mais nous avions le même problème l’année dernière et il y avait une erreur de correspondance entre le type de données de chaîne déclaré dans SQL et le xml envoyé.

J’ai trouvé ceci sur google. http://social.msdn.microsoft.com/forums/en-US/sqlxml/thread/d40ef582-4ffe-4f4b-b6b8-03c6c0ba1a32/

Je pense que vous pouvez remplacer la ligne

 _cmd.Parameters.Add("@XmlContents", SqlDbType.Xml); 

avec

 _cmd.Parameters.Add("@XmlContents", System.Data.SqlTypes.SqlXml); 

Pourriez-vous éventuellement réécrire le fichier XML en tant qu’unicode (peut-être dans un MemoryStream ) et l’envoyer? Remarque: si vous ne varbinary(max) les données, vous pouvez utiliser varbinary(max) (et ce sera en fait plus rapide). Cela ne présente pas de difficultés d’encodage et vous permettra également d’auditer tout fichier XML corrompu que vous recevez.

Si vous interrogez les données en tant que XML dans le serveur de firebase database, xml est évidemment la solution.

modifier
J’ai raté la partie ISO-8859-1 de la question – la solution ci-dessous est bonne pour UTF8, mais ne résout évidemment pas le problème de Marc car il ne peut pas modifier le codage.


Voici la solution que j’utilise:

  • Insertion de XML dans une firebase database SQL

Et une version légèrement modifiée du code ci-dessus (je l’ai testé avec un fichier UTF8 à l’aide de SQL 2005):

 using System.IO; using System.Text; using System.Data; using System.Data.SqlClient; using System.Data.SqlTypes; ... using (SqlConnection connection = new SqlConnection("conn ssortingng")) { connection.Open(); ssortingng sql = "INSERT INTO mytable (xmlColumn) VALUES (@xmlData)"; using (SqlCommand command = new SqlCommand(sql, connection)) { // Swap round if the source file is unicode ssortingng xml = File.ReadAllText(@"C:\myxml.xml"); //ssortingng xml = File.ReadAllText(@"C:\myxml.xml", Encoding.Unicode); using (MemoryStream stream = new MemoryStream()) { using (StreamWriter writer = new StreamWriter(stream, Encoding.Unicode)) { writer.Write(xml); writer.Flush(); stream.Position = 0; SqlParameter parameter = new SqlParameter("@xmlData", SqlDbType.Text); parameter.Value = new SqlXml(stream); command.Parameters.Add(parameter); command.ExecuteNonQuery(); } } } } 

Même j’ai rencontré un problème similaire lors de l’insertion de contenu XML dans la firebase database. Pour ex, l’entrée était comme ceci:

 Insert Into TestData(Xml) Values ('< ?xml version="1.0" encoding="UTF-8"?>') 

Ce type d’instruction était voué à l’échec et j’obtenais une erreur «incapable de changer…». Plus tard, j’ai simplement préfixé N en chaîne xml comme ceci:

 Insert Into TestData(Xml) Values (N'< ?xml version="1.0" encoding="UTF-8"?>') 

Après cela, ça a commencé à fonctionner !!!