Essayez de stocker du contenu XML dans SQL Server 2005 ne marche pas (problème d'encodage)
Gens,
J'ai un webservice qui renvoie des données dans la norme ISO-8859-1 codage - puisque ce n'est pas la mienne, je ne peux pas changer 🙁
À des fins de vérification, j'aimerais stocker le fichier XML à partir de ces appels dans un SQL Server 2005 tableau, dans lequel j'ai un champ de type "XML NULL".
De mon code C#, j'ai essayer 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();
De la difficulté, lorsque j'exécute ce code, j'obtiens en retour un message d'erreur:
Msg 9402, Niveau 16, État 1, Ligne 1
Analyse XML: ligne 1, le caractère xy, incapables de changer l'encodage
?? J'ai été à essayer de comprendre où et comment je pourrais peut-être "switch" du codage - pas de chance jusqu'à présent. Qu'est-ce que cela signifie? Je ne peut pas stocker XML avec de l'ISO-8859-1 codage dans SQL Server 2005?? Ou est-il une astuce pour a) dire à SQL Server 2005 à accepter ce codage, ou b) pour convertir automatiquement le webservice réponse à l'encodage UTF avant de le ranger dans SQL Server?
Merci pour tous les conseils, les pointeurs, les bouts!
Marc
OriginalL'auteur marc_s | 2008-12-21
Vous devez vous connecter pour publier un commentaire.
Vous avez besoin de convertir en utf-16
Je ne suis pas un expert en XML dans SQL Server, même si je l'utilise, mais nous avons eu le même problème l'année dernière et il a été mis-match de la chaîne de caractères type de données déclaré dans SQL par rapport au xml envoyé.
Ce n'est pas correct - il n'y a pas besoin de convertir en UTF-16. Veuillez consulter la stackoverflow.com/a/8998183/751158 .
Cette réponse a un lien mort.
OriginalL'auteur gbn
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
avec
Voir stackoverflow.com/a/1566154/751158 pour le bon moyen de le faire.
OriginalL'auteur Nathan Koop
Pourriez-vous éventuellement ré-écrire le xml au format unicode (peut-être à un
MemoryStream
) et l'envoyer? Remarque: si vous êtes juste stockage les données, vous pouvez utiliservarbinary(max)
(et il sera effectivement plus rapide). Cela n'a pas d'encodage des difficultés, et vous permettra également de vérification corrompu xml que vous recevez.Si vous interrogez les données au format xml à l'intérieur de la base de données du serveur puis
xml
est évidemment la voie à suivre.Alors peut-être regarder tout simplement ré-écriture du xml pour chaneg l'encodage avant de les envoyer au serveur.
OriginalL'auteur Marc Gravell
J'ai posté quelques infos:
http://mrboratech.blogspot.com/2009/02/how-to-store-xmldocument-mssql-2005-as.html
OriginalL'auteur
Modifier
J'ai raté le ISO-8859-1 partie de la question - la solution ci-dessous qui est bon pour l'utf-8, mais n'a évidemment pas résoudre Marc de problème puisqu'il ne peut pas modifier l'encodage.
Voici la solution que j'utilise:
Et une version légèrement modifiée du code ci-dessus (je l'ai testé avec une UTF8 fichier à l'aide de SQL 2005):
John, comme je suis sûr que vous savez MemoryStream.Disposer ne fait rien si il n'y a pas de gain, les bouffées de chaleur de l'écrivain (c'est à dire de l'écrivain.Disposer) serait de quitter l'SqlCommand avec un éliminé de l'Écrivain. Si j'ai effectué l'exécuter à l'intérieur de l'Écrivain à l'aide de (), puis l'Écrivain ne serait pas vidées et si vide, ce qui est mon raisonnement pour expliquer pourquoi je l'ai fait comme ci-dessus. Le code prévoit un UTF16 fichier de sorte qu'il ne serait pas travailler avec IS0-8859 (qui est en UTF8 autant que je sache).
Manqué à la norme ISO-8859-1 partie de la question, mon erreur
MemoryStream.Disposer peut ne rien faire aujourd'hui. C'est dans la mise en œuvre de détails, vous ne devrait pas dépendre, jamais. Ne pas utiliser jusqu'à ExecuteNonQuery est fini, bien sûr. Et vous devez définir une nouvelle position du pointeur à 0.
Ok assez juste, j'ai pris les conseils et les mises à jour. Le code avant de a été en cours d'exécution (court plus vite maintenant étrangement bien).
OriginalL'auteur Chris S
Même j'ai été confronté problème similaire lors de l'insertion de contenu xml db.
Pour les anciens , l'entrée était comme ça:
Ce genre de déclaration utilisé par un échec et j'ai été faire "impossible de passer .." erreur. Plus tard, j'ai simplement le préfixe N de chaîne xml comme ceci :
Après cela, il a commencé à travailler !!!
OriginalL'auteur Karthik D V