18

データベースに のタイプの列がありますxml。.net 経由でこの情報を読んSqlDataReaderでいますが、何にキャストすればよいかわかりません。

msdn テーブル ( http://msdn.microsoft.com/en-us/library/cc716729.aspxXml ) は、それが.net タイプであることを示唆していますがSystem.XmlSystem.Web.UI.WebControls.Xmlそれが正しいかどうかはわかりません。

だから私の質問はこれです:

SqlDbType.Xmlから読み取るときに を何にキャストし、それSqlDataReaderを に変換するにはどうすればよいXmlDocumentですか?

4

4 に答える 4

27

それはに変換され、そこからSqlXml取得できます。文字列の代わりにメソッドを使用 して型を取得する必要があります。XmlReaderSqlXml.CreateReaderSqlDataReader.GetSqlXml

例えば:

        SqlDataReader reader = cmd.ExecuteReader();
        while (reader.Read())
        {
            SqlXml xmlData =
            reader.GetSqlXml(0);
            XmlReader xmlReader = xmlData.CreateReader();

            xmlReader.MoveToContent();
            while (xmlReader.Read())
            {
                if (xmlReader.NodeType == XmlNodeType.Element)
                {
                    string elementName = xmlReader.LocalName;
                    xmlReader.Read();
                    Console.WriteLine(elementName + ": " + xmlReader.Value);
                }
            }
        }

更新: @Wiktor Zychla からの有益なコメントに回答するには

このアプローチのパフォーマンスは優れており、ストリームから直接 XmlReaderを作成するときに最初にフィールドの内容を文字列にロードするため、大きな XML フィールドを処理する場合ははるかに優れたものになる可能性があります。これは、Reflector または同様のツールで System.Data を調べることですぐに確認できます。SqlReader.GetStringSqlReader.GetSqlXml

于 2012-12-03T20:24:30.217 に答える
5

文字列にキャストしたのを覚えています。XmlDocumentに文字列をフィードすると、通常どおり機能します。

于 2012-12-03T20:24:14.620 に答える
4

私はこの方法を自分で使用します。SqlCommand.ExecuteXmlReader();

XmlDocument xdoc = new XmlDocument();
using (SqlCommand command = new SqlCommand(queryString, connection))
{
    XmlReader reader = command.ExecuteXmlReader();
    if (reader.Read())
    {
        xdoc.Load(reader);
    }
}
于 2012-12-03T20:33:26.330 に答える
0

確かに、System.Xml名前空間があります:

System.Xml名前空間は、XMLを処理するための標準ベースのサポートを提供します。

ただし、これを使用するには、プロジェクトの参照として追加する必要があります。Microsoftには、VisualStudioでこれを行うための手順があります。

于 2012-12-03T20:23:37.553 に答える