AdomdDataReader を使用したデータの取得

AdomdDataReader オブジェクトは、オーバーヘッドと対話性のバランスがとれた分析データ取得方法です。AdomdDataReader オブジェクトは、分析データ ソースから、読み取り専用かつ順方向専用のフラットなデータ ストリームを取得します。このようにデータ ストリームがバッファリングされないことで、手順ロジックにより、分析データソースから取得した結果を順次効率的に処理することができます。大量のデータを取得して表示する場合は、データがメモリ キャッシュに格納されない AdomdDataReader が適しています。

AdomdDataReader では、返されるクエリの完全な結果を待たずに、使用可能になったデータをすぐに取得できるので、アプリケーションのパフォーマンスも向上します。また、AdomdDataReader は、既定では一度に 1 つの行のみをメモリに格納するため、システムのオーバーヘッドが軽減されます。

パフォーマンスが最適化される代わりに、AdomdDataReader オブジェクトの場合、取得したデータに関する情報は他のデータ取得方法より少なくなります。AdomdDataReader オブジェクトは、データやメタデータを表す大規模オブジェクト モデルをサポートしていません。また、セルの書き戻しなど、複雑な分析機能も実行できません。その代わり、AdomdDataReader オブジェクトには、セルセットのデータを取得するための厳密に型指定されたメソッド セットと、セルセットのメタデータを表形式で取得するためのメソッドが用意されています。また、AdomdDataReader は、IDbDataReader インターフェイスを実装してデータ バインドをサポートし、Microsoft .NET Framework クラス ライブラリの System.Data 名前空間の SelectCommand メソッドを使用してデータを取得します。

AdomdDataReader からのデータの取得

AdomdDataReader オブジェクトを使用してデータを取得するには、次の手順を実行します。

  1. このオブジェクトの新しいインスタンスを作成します。

    AdomdDataReader クラスの新しいインスタンスを作成するには、AdomdCommand オブジェクトの Execute メソッドまたは ExecuteReader メソッドを呼び出します。

  2. データを取得します。

    コマンドでクエリを実行すると、ADOMD.NET は Resultset 形式 (XML for Analysis 仕様に記述されている表形式) で結果を返して、AdomdDataReader オブジェクトのデータをフラット化します。このようなデータで、さまざまな次元を考慮して分析データをクエリする場合、表形式は一般的ではありません。

    ADOMD.NET は、これらの表形式の結果を、次のメソッドのいずれかを使用して要求されるまでクライアントのネットワーク バッファに格納します。

    • AdomdDataReader オブジェクトの Read メソッドを呼び出します。

      Read メソッドは、クエリ結果から行を取得します。その後、列の名前または順序付き参照を Item プロパティに渡して、返される行の各列にアクセスできます。たとえば、現在の行の最初の列の名前は ColumnName になります。次に、reader[0].ToString() または reader["ColumnName"].ToString() は、現在の行の最初の列のコンテンツを返します。

    • 型指定されたアクセサ メソッドのいずれかを呼び出します。

      AdomdDataReader は、一連の型指定されたアクセサ メソッドを提供します。このメソッドを使用すると、ネイティブ データ型の列値にアクセスできます。列値の基になるデータ型がわかっている場合は、型指定されたアクセサ メソッドを使用することで列値の取得時に必要な型変換が削減され、その結果、最良のパフォーマンスを実現できます。

      使用可能な型指定されたアクセサ メソッドには、GetDateTimeGetDoubleGetInt32 などがあります。型指定されたアクセサ メソッドの一覧については、「AdomdDataReader」を参照してください。

  3. AdomdDataReader を閉じます。

    AdomdDataReader オブジェクトの使用が終了したら、常に Close メソッドを呼び出す必要があります。AdomdDataReader オブジェクトのインスタンスを開いている間は、AdomdConnectionAdomdDataReader によって排他的に使用されています。元の AdomdDataReader を閉じるまで、別の AdomdDataReader または System.Xml.XmlReader の作成など、AdomdConnection のインスタンスではどのコマンドも実行できません。

AdomdDataReader からのデータ取得の例

次のコード例は、AdomdDataReader オブジェクトを反復処理し、最初の 2 つの値を文字列として各列から返します。

If Reader.HasRows Then
    Do While objReader.Read()
        Console.WriteLine(vbTab & "{0}" & vbTab & "{1}", _
            objReader.GetString(0), objReader.GetString(1))
    Loop
Else
  Console.WriteLine("No rows returned.")
End If

objReader.Close()
if (objReader.HasRows)
  while (objReader.Read())
    Console.WriteLine("\t{0}\t{1}", _
        objReader.GetString(0), objReader.GetString(1));
else
  Console.WriteLine("No rows returned.");

objReader.Close();

AdomdDataReader からのメタデータの取得

AdomdDataReader オブジェクトのインスタンスが開いている場合、GetSchemaTable メソッドを使用して現在のレコードセットに関するスキーマ情報 (メタデータ) を取得できます。GetSchemaTable は、現在のレコードセットのスキーマ情報を使用して作成された DataTable オブジェクトを返します。DataTable は、レコードセットの各列に対して 1 つの行を含みます。スキーマ テーブル行の各列は、セルセットに返される列のプロパティにマップされます。ここで、ColumnName はプロパティの名前で、列の値はプロパティの値です。

AdomdDataReader からのメタデータ取得の例

次のコード例では、AdomdDataReader オブジェクトのスキーマ情報を書き出しています。

Dim schemaTable As DataTable = objReader.GetSchemaTable()

Dim objRow As DataRow
Dim objColumn As DataColumn

For Each objRow In schemaTable.Rows
  For Each objColumn In schemaTable.Columns
    Console.WriteLine(objColumn.ColumnName & " = " & objRow(objColumn).ToString())
  Next
  Console.WriteLine()
Next
DataTable schemaTable = objReader.GetSchemaTable();
foreach (DataRow objRow in schemaTable.Rows)
{
  foreach (DataColumn objColumn in schemaTable.Columns)
    Console.WriteLine(objColumn.ColumnName + " = " + objRow[objColumn]);
  Console.WriteLine();
}

複数の結果セットの取得

データ マイニングは入れ子になったテーブルの概念をサポートします。入れ子になったテーブルは、ADOMD.NET では入れ子になった行セットとして示されます。各行に関連付けられた入れ子になった行セットを取得するには、GetDataReader メソッドを呼び出します。