8
votes

Comment obtenir des données XML d'une colonne dans une table SQL?

J'ai une table en SQL et une de ses colonnes est un type de données XML. Comment puis-je pouvoir obtenir sa valeur de SQL à ASP.NET (C #) Code-Berrière? Je veux le stocker comme type XML et non en tant que type de chaîne, car je dois manipuler les valeurs et les attributs à l'intérieur de celui-ci. J'ai essayé de l'obtenir et de la mettre sur une variable de type à chaîne et de ce que je reçois est quelque chose comme ça: aayyynnynstarlight. Je voudrais obtenir cela à la place:

<ANSWERS>
<Answer item="ddl_3">A</Answer>
<Answer item="ddl_8">A</Answer>
<Answer item="ddl_13">Y</Answer>
<Answer item="ddl_16">Y</Answer>
<Answer item="ddl_19">Y</Answer>
<Answer item="ddl_22">N</Answer>
<Answer item="ddl_26">Y</Answer>
<Answer item="ddl_30">N</Answer>
<Answer item="ddl_34">Y</Answer>
<Answer item="ddl_38">N</Answer>
<Answer item="ddl_42">StarLight</Answer>
</ANSWERS>


0 commentaires

3 Réponses :


2
votes

Je suppose que vous obtenez des données de SQL Server à l'aide de tout droit Ado.net et non d'un cadre d'entité comme une ormission. Si je lis la documentation ici correctement, les colonnes XML sont exposé comme un xmlreader que vous pouvez récupérer en utilisant le Méthode GetsQLXML .

Une fois que vous avez un xmlreader, vous pouvez le charger directement dans un xdocument à l'aide du charge méthode.

Une autre chose que vous pourriez être intéressée est qu'il existe deux espaces de noms XML différents, jetez un coup d'œil à cette question sur la différence entre xdocument et xmldocument .


4 commentaires

J'ai vérifié le lien à propos de ce xdocument.parse, mais il n'accepte que le type de chaîne en tant que paramètre. Et la colonne que j'ai est un type XML. Si je stocke cela à partir de XML (SQL DataType) à String XMLValue, toutes les balises XML seront parties. Donc, quand j'ai essayé d'utiliser xdocument.parse (xmlvalue), il jette une erreur "La chaîne n'a pas été reconnue comme une URI valide."


En fait, j'ai un problème en utilisant ce xmlreader car nous avons une classe distincte pour tous les données de données. Quand j'essaie cette méthode, je reçois "une tentative invalide de lire lorsque le lecteur est fermé". Je pense que c'est parce que, après que la classe d'accès aux données renvoie le résultat XML au code de code, la classe d'accès aux données ferme la xmlreader. Quoi qu'il en soit, merci de me parler de xdocument. Cela m'a donné une solution alternative. Je stockerai le document XML sur SQL comme une chaîne au lieu de type XML (que je connais n'est pas une solution très élégante). Alors, quand je le récupérerai, je vais utiliser xdocument.parse: D


@Rome: Avez-vous un contrôle sur les classes d'accès aux données? Pourriez-vous les modifier pour lire correctement les données XML et renvoyer un document XML au lieu d'une chaîne?


Vous pouvez utiliser xdocument.load (mydatareader.getsqlxml (i) .cremeaderader ()) au lieu de .parse.



2
votes

Si vous faites quelque chose comme celui-ci dans votre code C #, vous allez certainement lire correctement le XML de votre base de données: xxx

lorsque vous mettez cette chaîne sur une page ASP.NET, cependant, L'ASP.NET Runtime tentera une transformation XSL et, par défaut, si vous ne spécifiez rien, XSLT renvoie simplement toutes les valeurs d'élément -> c'est la chaîne de votre vue affichée.

mais lecture De la base de données fonctionne très certainement bien! Une fois que vous avez cette chaîne contenant tout votre XML, vous pouvez le faire tout ce que vous aimez - le manipuler avec LINQ-TO-XML ou autre.


1 commentaires

Méfiez-vous que ExecutesCalar ne lit que 2033 caractères. Tout ce qui précède est coupé!



2
votes

Eh bien, après quelques recherches plus intenses, j'ai pu répondre à ma propre question. : D

Voici Code: P>

private void ddl_Eval_SelectedIndexChanged (Object sender, System.EventArgs e)
{
    //Response.Write(ddl_Eval.SelectedValue.ToString() + " " + "value: " + ddl_Eval.SelectedIndex);

    dtEval = new DataTable();
    dtEval = data.GetEvaluation2();
    DataView dvEval = dtEval.DefaultView;

    string xmlDoc = String.Empty;

    foreach (DataRowView drvEval in dvEval)
    {
        if (drvEval.Row["EvaluationID"].ToString() == ddl_Eval.SelectedValue.ToString())
        {
            xmlDoc = drvEval.Row["EvalAnswers"].ToString();
        }
    }

    XDocument xdoc = new XDocument();
    xdoc = XDocument.Parse(xmlDoc);

    foreach (XElement child in xdoc.Root.Elements("Answer"))
    {
        Response.Write(child.Attribute("item").Value + " " + child.Value + "<br />");
    }

}


0 commentaires