次の方法で共有


ADOMD.NET のクライアント機能

ADOMD.NET は、他の Microsoft .NET Framework データ プロバイダと同様、アプリケーションとデータ ソースの間の仲介役となります。ただし、分析データを扱うという点で、他の .NET Framework データ プロバイダとは異なります。分析データを操作する ADOMD.NET では、サポートされている機能が他の .NET Framework データ プロバイダとは大きく違っています。データを取得するだけでなく、メタデータを取得したり、分析データ ストアの構造を変更したりすることができます。

  • メタデータの取得
    スキーマ行セットまたはオブジェクト モデルを使用してメタデータを取得することにより、データ ソースから取得できるデータについてアプリケーションでより多くの情報を得ることができます。たとえば、利用可能な各主要業績評価指標 (KPI) の型、キューブのディメンション、マイニング モデルで必要とされるパラメータなどの情報を入手できます。取得するデータの型、深さ、およびスコープをユーザー入力に基づいて判断する "動的" アプリケーションでは、メタデータが非常に重要になります。たとえば、クエリ アナライザ、Microsoft Excel、その他のクエリ ツールがこれに該当します。あらかじめ定義された一連のアクションを実行する "静的" アプリケーションでは、動的アプリケーションほどメタデータは重要ではありません。

    詳細については、「分析データ ソースからのメタデータの取得」を参照してください。

  • データの取得
    データの取得とは、データ ソースに格納されている情報を実際に取得することです。データ ソースの構造がわかっている "静的" アプリケーションでは、データの取得が主要な機能になります。また、データの取得は "動的" アプリケーションの最終結果でもあります。たとえば、特定の時刻の KPI の値、この 1 時間の間に各店舗で販売された自転車の数、従業員の年間の業績を左右する要因などのデータを取得できます。データの取得は、クエリを実行するすべてのアプリケーションにとって不可欠です。

    詳細については、「分析データ ソースからのデータの取得」を参照してください。

  • 分析データの構造の変更
    ADOMD.NET を使用すると、分析データ ストアの構造を実際に変更することもできます。この操作は、分析管理オブジェクト (AMO) オブジェクト モデルを通じて行われるのが一般的ですが、ADOMD.NET を使用すると、Analysis Services Scripting Language (ASSL) コマンドを送信してサーバーのオブジェクトを作成、変更、または削除できます。

    詳細については、「分析データ ソースに対するコマンドの実行」、「分析管理オブジェクト (AMO)」、および「Analysis Services スクリプト言語のリファレンス」を参照してください。

メタデータの取得、データの取得、およびデータ構造の変更は、それぞれ一般的な ADOMD.NET アプリケーションのワークフローの特定の段階で行われます。

一般的な処理フロー

通常の ADOMD.NET アプリケーションは、一般に、次に示す同じワークフローに従って分析データベースを操作します。

  1. 最初に、AdomdConnection オブジェクトを使用してデータベースへの接続を確立します。接続を開くと、接続先サーバーに関するメタデータが AdomdConnection オブジェクトによって公開されます。動的アプリケーションでは、この情報の一部がユーザーに表示されて、クエリを実行するキューブなどをユーザーが選択できるようになるのが一般的です。このステップで作成された接続は、アプリケーションで繰り返し利用できます。これにより、オーバーヘッドが軽減されます。

    詳細については、「ADOMD.NET での接続の確立」を参照してください。

  2. 接続が確立されると、動的アプリケーションは、サーバーに対してより詳細なメタデータを問い合わせます。静的アプリケーションの場合は、アプリケーションによるクエリの対象となるオブジェクトがあらかじめわかっているため、このメタデータを取得する必要はありません。取得したメタデータは、アプリケーションやユーザーが次のステップで使用できます。

    詳細については、「分析データ ソースからのメタデータの取得」を参照してください。

  3. 次に、アプリケーションはサーバーに対してコマンドを実行します。追加のメタデータの取得、データの取得、データベースの構造の変更などのためのコマンドを実行できます。いずれの場合も、アプリケーションであらかじめ決められたクエリを使用することも、新たに取得したメタデータを使用して追加のクエリを作成することもできます。

    詳細については、「分析データ ソースからのメタデータの取得」、「分析データ ソースからのデータの取得」、「分析データ ソースに対するコマンドの実行」を参照してください。

  4. コマンドがサーバーに送信されると、メタデータやデータをクライアントに返す処理がサーバーで開始されます。この情報は、CellSet オブジェクト、AdomdDataReader オブジェクト、または System.XmlReader オブジェクトを使用して表示できます。

次の例は、この一般的なワークフローを示しています。この例に含まれているメソッドは、データベースへの接続を開き、既知のキューブに対してコマンドを実行し、結果をセルセットに取得します。このセルセットは、列ヘッダー、行ヘッダー、およびセル データを含むタブ区切りの文字列を返します。

string ReturnCommandUsingCellSet()
{
    //Create a new string builder to store the results
    System.Text.StringBuilder result = new System.Text.StringBuilder();

    //Connect to the local server
    using (AdomdConnection conn = new AdomdConnection("Data Source=localhost;"))
    {
        conn.Open();

        //Create a command, using this connection
        AdomdCommand cmd = conn.CreateCommand();
        cmd.CommandText = @"
                      WITH MEMBER [Measures].[FreightCostPerOrder] AS 
                            [Measures].[Reseller Freight Cost]/[Measures].[Reseller Order Quantity],  
                            FORMAT_STRING = 'Currency'
                      SELECT 
                            [Geography].[Geography].[Country].&[United States].Children ON ROWS, 
                            [Date].[Calendar].[Calendar Year] ON COLUMNS
                      FROM [Adventure Works]
                      WHERE [Measures].[FreightCostPerOrder]";

        //Execute the query, returning a cellset
        CellSet cs = cmd.ExecuteCellSet();

        //Output the column captions from the first axis
        //Note that this procedure assumes a single member exists per column.
        result.Append("\t");
        TupleCollection tuplesOnColumns = cs.Axes[0].Set.Tuples;
        foreach (Tuple column in tuplesOnColumns)
        {
            result.Append(column.Members[0].Caption + "\t");
        }
        result.AppendLine();

        //Output the row captions from the second axis and cell data
        //Note that this procedure assumes a two-dimensional cellset
        TupleCollection tuplesOnRows = cs.Axes[1].Set.Tuples;
        for (int row = 0; row < tuplesOnRows.Count; row++)
        {
            result.Append(tuplesOnRows[row].Members[0].Caption + "\t");
            for (int col = 0; col < tuplesOnColumns.Count; col++)
            {
                result.Append(cs.Cells[col, row].FormattedValue + "\t");
            }
            result.AppendLine();
        }
        conn.Close();

        return result.ToString();
    } // using connection
}