SQL Server では、xml データ型をサポートしています。開発者は、SqlCommand クラスの標準動作を使用し、この型を含む結果セットを取得できます。 任意の列が (xml などに) 取得されるように、SqlDataReader 列を取得できますが、列のコンテンツを XML として操作する必要がある場合は、XmlReader を使用する必要があります。
例
次のコンソール アプリケーションでは、xml データベースの Sales.Store テーブルから 2 行を選択し、この行の 列を SqlDataReader インスタンスに格納します。 行ごとに、xml の GetSqlXml メソッドを使用して SqlDataReader 列の値が読み取られます。 この値は XmlReader に格納されます。 コンテンツを GetSqlXml 変数に設定する場合は、GetValue メソッドではなく SqlXml を使用する必要があることに注意してください。GetValue は、xml 列の値を文字列として返します。
Note
AdventureWorks サンプル データベースは、既定では SQL Server のインストール時にはインストールされません。 SQL Server Setup を実行してインストールします。
using Microsoft.Data.SqlClient;
using System.Xml;
using System.Data.SqlTypes;
class Class1
{
static void Main()
{
string c = "Data Source=(local);Integrated Security=true;" +
"Initial Catalog=AdventureWorks; ";
GetXmlData(c);
Console.ReadLine();
}
static void GetXmlData(string connectionString)
{
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
// The query includes two specific customers for simplicity's
// sake. A more realistic approach would use a parameter
// for the CustomerID criteria. The example selects two rows
// in order to demonstrate reading first from one row to
// another, then from one node to another within the xml column.
string commandText =
"SELECT Demographics from Sales.Store WHERE " +
"CustomerID = 3 OR CustomerID = 4";
SqlCommand commandSales = new SqlCommand(commandText, connection);
SqlDataReader salesReaderData = commandSales.ExecuteReader();
// Multiple rows are returned by the SELECT, so each row
// is read and an XmlReader (an xml data type) is set to the
// value of its first (and only) column.
int countRow = 1;
while (salesReaderData.Read())
// Must use GetSqlXml here to get a SqlXml type.
// GetValue returns a string instead of SqlXml.
{
SqlXml salesXML =
salesReaderData.GetSqlXml(0);
XmlReader salesReaderXml = salesXML.CreateReader();
Console.WriteLine("-----Row " + countRow + "-----");
// Move to the root.
salesReaderXml.MoveToContent();
// We know each node type is either Element or Text.
// All elements within the root are string values.
// For this simple example, no elements are empty.
while (salesReaderXml.Read())
{
if (salesReaderXml.NodeType == XmlNodeType.Element)
{
string elementLocalName =
salesReaderXml.LocalName;
salesReaderXml.Read();
Console.WriteLine(elementLocalName + ": " +
salesReaderXml.Value);
}
}
countRow = countRow + 1;
}
}
}
}