共用方式為


ADOMD.NET 用戶端功能

ADOMD.NET 和其他 Microsoft .NET Framework 資料提供者一樣,可做為應用程式與資料來源之間的橋樑。不過,ADOMD.NET 與其他 .NET Framework 資料提供者不同的是,ADOMD.NET 可處理分析資料。為了處理分析資料,ADOMD.NET 支援與其他 .NET Framework 資料提供者非常不一樣的功能。ADOMD.NET 不僅可讓您擷取資料,還可以擷取中繼資料並變更分析資料存放區的結構:

  • 擷取中繼資料
    應用程式可以進一步了解使用結構描述資料列集或是物件模型,透過中繼資料擷取從資料來源擷取的資料。每個可用的關鍵效能指標 (KPI) 類型、在 Cube 中的維度以及採礦模型所需的參數等資訊全部都是可探索的。中繼資料對於需要使用者輸入以決定要擷取的類型、深度和資料範圍之「動態」(Dynamic) 應用程式而言,是最重要的。範例包括 Query Analyzer、Microsoft Excel 及其他查詢工具。中繼資料對於執行一組預先定義的動作之「靜態」(Static) 應用程式而言較不重要。

    如需詳細資訊,請參閱<從分析資料來源擷取中繼資料>。

  • 擷取資料
    資料擷取是實際擷取儲存在資料來源中的資訊。資料擷取是「靜態」應用程式的主要功能,這些應用程式知道資料來源的結構。資料擷取也是「動態」應用程式的最終結果。當天給定時間點上的 KPI 值、每家店前一個小時內所銷售的腳踏車數目,以及決定員工年度績效的因素,全部都是可以擷取的資料範例。擷取資料對於任何查詢應用程式都是非常重要的。

    如需詳細資訊,請參閱<從分析資料來源擷取資料>。

  • 變更分析資料的結構
    ADOMD.NET 也可用以實際變更分析資料存放區的結構。雖然這通常是透過「分析管理物件」(AMO) 物件模型來完成,不過,您可以使用 ADOMD.NET 傳送「Analysis Services 指令碼語言」(ASSL) 命令,來建立、修改或是刪除伺服器上的物件。

    如需詳細資訊,請參閱<針對分析資料來源執行命令>、<分析管理物件 (AMO)>和<Analysis Services 指令碼語言參考>。

擷取中繼資料、擷取資料以及變更資料結構,每個都發生在一般 ADOMD.NET 應用程式工作流程中的某個特定點。

一般處理流程

傳統的 ADOMD.NET 應用程式通常會在處理分析資料庫時,遵循相同的工作流程。

  1. 首先,使用 AdomdConnection 物件,建立連至資料庫的連接。當您開啟連接時,AdomdConnection 物件會公開您已連接之伺服器的中繼資料。在動態應用程式中,通常會對使用者顯示這項資訊的某些部分,這樣使用者就可以做選擇,例如要查詢哪個 Cube。應用程式可以多次重複使用在這個步驟期間建立的連接,以減少負擔。

    如需詳細資訊,請參閱<在 ADOMD.NET 中建立連接>。

  2. 一旦建立連接,動態應用程式就會查詢伺服器,以取得更多特定的中繼資料。若是靜態應用程式,程式設計人員會預先知道應用程式將查詢哪些物件,因此將不需要擷取此中繼資料。應用程式與使用者可以在下一個步驟中使用已擷取的中繼資料。

    如需詳細資訊,請參閱<從分析資料來源擷取中繼資料>。

  3. 應用程式接著會針對伺服器執行命令。這個命令可能是為了擷取其他中繼資料、擷取資料或修改資料庫結構等目的。對於這些工作的任何一個,應用程式都可以使用先前決定的查詢,或是利用新擷取的中繼資料以建立其他查詢。

    如需詳細資訊,請參閱<從分析資料來源擷取中繼資料>、<從分析資料來源擷取資料>和<針對分析資料來源執行命令>。

  4. 一旦將命令傳送到伺服器,伺服器會開始將中繼資料或是資料傳回用戶端。這項資訊可使用 CellSet 物件、AdomdDataReader 物件或是 System.XmlReader 物件來檢視。

為了說明這個傳統的工作流程,下列範例所含的方法會開啟資料庫的連接、針對已知的 Cube 執行命令,以及將結果擷取至資料格集。資料格集接著會傳回含有資料行標頭、資料列標頭以及資料格資料的 Tab 鍵分隔字串。

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
}