Migrieren von ADO MD zu ADOMD.NET

Die ADOMD.NET-Bibliothek ist ähnlich wie die ADO MD-Bibliothek (ActiveX Data Objects Multidimensional) eine Erweiterung der ADO-Bibliothek (ActiveX Data Objects), die verwendet wird, um auf mehrdimensionale Daten in COM-basierten (Component Object Model) Clientanwendungen zuzugreifen. ADO MD bietet einen leichten Zugriff auf mehrdimensionale Daten aus nicht verwalteten Sprachen, wie C++ und Microsoft Visual Basic. ADOMD.NET bietet einen leichten Zugriff auf analytische (sowohl mehrdimensional als auch Data Mining) Daten aus verwalteten Sprachen, wie Microsoft C# und Microsoft Visual Basic .NET. Darüber hinaus stellt ADOMD.NET ein verbessertes Metadaten-Objektmodell bereit.

Die Migration bestehender Clientanwendungen von ADO MD auf ADOMD.NET ist leicht. Allerdings gibt es diverse wichtige Unterschiede in Bezug auf die Migration:

  • So stellen Sie Konnektivität und Datenzugriff für Clientanwendungen bereit

    ADO MD

    ADOMD.NET

    Erfordert Verweise auf sowohl Adodb.dll als auch Adomd.dll.

    Erfordert einen einzelnen Verweis auf Microsoft.AnalysisServices.AdomdClient.dll.

    Zusätzlich zum Zugriff auf Metadaten stellt die AdomdConnection-Klasse Konnektivitätsunterstützung bereit.

  • So rufen Sie Metadaten für mehrdimensionale Objekte ab

    ADO MD

    ADOMD.NET

    Verwenden Sie die Catalog-Klasse.

    Verwenden Sie die Cubes-Eigenschaft von AdomdConnection.

  • So führen Sie Abfragen aus und geben Cellset-Objekte zurück

    ADO MD

    ADOMD.NET

    Verwenden Sie die CellSet-Klasse.

    Verwenden Sie die AdomdCommand-Klasse.

  • So greifen Sie auf die Metadaten zu, die verwendet werden, um ein Cellset anzuzeigen

    ADO MD

    ADOMD.NET

    Verwenden Sie die Position-Klasse.

    Verwenden Sie die Objekte Set und Tuple.

    HinweisHinweis

    Die Position-Klasse wird aus Gründen der Abwärtskompatibilität unterstützt.

  • So rufen Sie Miningmodellmetadaten ab

    ADO MD

    ADOMD.NET

    Keine Klasse verfügbar.

    Verwenden Sie eine der Data Mining-Auflistungen:

Um diese Unterschiede herauszustellen, vergleicht das folgende Migrationsbeispiel eine bestehende ADO MD-Anwendung mit einer entsprechenden ADOMD.NET-Anwendung.

Anschauen eines Migrationsbeispiels

Sowohl die vorhandenen ADO MD- als auch die entsprechenden ADOMD.NET-Codebeispiele, die in diesem Abschnitt angegeben sind, führen die gleichen Gruppen an Aktionen aus: Erstellen einer Verbindung, Ausführen einer MDX-Anweisung (Multidimensional Expressions) und Abrufen von Metadaten und Daten. Allerdings verwenden diese beiden Codesätze nicht die gleichen Objekte zur Ausführung dieser Tasks.

Vorhandener ADO MD-Code

Das folgende, aus der ADO MD 2.8-Dokumentation entliehene Codebeispiel ist in Microsoft Visual Basic® 6.0 geschrieben und verwendet ADO MD, um zu veranschaulichen, wie eine Verbindung zu einer MicrosoftSQL Server-Datenquelle aufgebaut und wie diese abgefragt wird. Dieses ADO MD-Beispiel verwendet die folgenden Objekte:

  • Erstellt eine Verbindung aus einem Catalog-Objekt.

  • Führt die MDX-Anweisung (Multidimensional Expressions) mithilfe des Cellset-Objekts aus.

  • Ruft die Metadaten und Daten vom Position-Objekt ab, die vom Cellset-Objekt abgerufen werden.

Private Sub cmdCellSettoDebugWindow_Click()
Dim cat As New ADOMD.Catalog
Dim cst As New ADOMD.Cellset
Dim i As Integer
Dim j As Integer
Dim k As Integer
Dim strServer As String
Dim strSource As String
Dim strColumnHeader As String
Dim strRowText As String

On Error GoTo Error_cmdCellSettoDebugWindow_Click
Screen.MousePointer = vbHourglass
'*-----------------------------------------------------------------------
'* Set server to local host.
'*-----------------------------------------------------------------------
    strServer = "LOCALHOST"

'*-----------------------------------------------------------------------
'* Set MDX query string source.
'*-----------------------------------------------------------------------
    strSource = strSource & "SELECT "
    strSource = strSource & "{[Measures].members} ON COLUMNS,"
    strSource = strSource & _
        "NON EMPTY [Store].[Store City].members ON ROWS"
    strSource = strSource & " FROM Sales"

'*-----------------------------------------------------------------------
'* Set active connection.
'*-----------------------------------------------------------------------
        cat.ActiveConnection = "Data Source=" & strServer & _
            ";Provider=msolap;"

'*-----------------------------------------------------------------------
'* Set cellset source to MDX query string.
'*-----------------------------------------------------------------------
        cst.Source = strSource

'*-----------------------------------------------------------------------
'* Set cellset active connection to current connection
'*-----------------------------------------------------------------------
    Set cst.ActiveConnection = cat.ActiveConnection

'*-----------------------------------------------------------------------
'* Open cellset.
'*-----------------------------------------------------------------------
    cst.Open

'*-----------------------------------------------------------------------
'* Allow space for row header text.
'*-----------------------------------------------------------------------
strColumnHeader = vbTab & vbTab & vbTab & vbTab & vbTab & vbTab

'*-----------------------------------------------------------------------
'* Loop through column headers.
'*-----------------------------------------------------------------------
       For i = 0 To cst.Axes(0).Positions.Count - 1
            strColumnHeader = strColumnHeader & _
                cst.Axes(0).Positions(i).Members(0).Caption & vbTab & _
                    vbTab & vbTab & vbTab
       Next
       Debug.Print vbTab & strColumnHeader & vbCrLf

'*-----------------------------------------------------------------------
'* Loop through row headers and provide data for each row.
'*-----------------------------------------------------------------------
        strRowText = ""
        For j = 0 To cst.Axes(1).Positions.Count - 1
            strRowText = strRowText & _
                cst.Axes(1).Positions(j).Members(0).Caption & vbTab & _
                    vbTab & vbTab & vbTab
            For k = 0 To cst.Axes(0).Positions.Count - 1
                strRowText = strRowText & cst(k, j).FormattedValue & _
                    vbTab & vbTab & vbTab & vbTab
            Next
            Debug.Print strRowText & vbCrLf
            strRowText = ""
        Next

    Screen.MousePointer = vbDefault
Exit Sub

Error_cmdCellSettoDebugWindow_Click:
   Beep
   Screen.MousePointer = vbDefault
   MsgBox "The following error has occurred:" & vbCrLf & _
      Err.Description, vbCritical, " Error!"
   Exit Sub
End Sub

Entsprechender ADOMD.NET-Code

Das folgende, in Visual Basic .NET und mittels ADOMD.NET geschriebene Beispiel veranschaulicht, wie die gleichen Aktionen ausgeführt werden wie bei dem zuvor genannten Visual Basic 6.0-Beispiel. Der Hauptunterschied zwischen dem folgenden Beispiel und dem zuvor genannten ADO MD-Beispiel liegt in den Objekten, die verwendet werden, um die Aktionen auszuführen. Das ADOMD.NET-Beispiel verwendet die folgenden Objekte:

  • Erstellt eine Verbindung mit einem AdomdConnection-Objekt.

  • Führt die MDX-Anweisung mithilfe eines AdomdCommand-Objekts aus.

  • Ruft die Metadaten und Daten vom Set-Objekt ab, die vom Cellset-Objekt abgerufen werden.

Private Sub DisplayCellSetInOutputWindow()
    Dim conn As AdomdConnection
    Dim cmd As AdomdCommand
    Dim cst As CellSet
    Dim i As Integer
    Dim j As Integer
    Dim k As Integer
    Dim strServer As String = "LOCALHOST"
    Dim strSource As String = "SELECT [Measures].members ON COLUMNS, " & _
        "NON EMPTY [Store].[Store City].members ON ROWS FROM SALES"
    Dim strOutput As New System.IO.StringWriter

    '*-----------------------------------------------------------------------
    '* Open connection.
    '*-----------------------------------------------------------------------
    Try
        ' Create a new AdomdConnection object, providing the connection
        ' string.
        conn = New AdomdConnection("Data Source=" & strServer & _
        ";Provider=msolap;")
        ' Open the connection.
        conn.Open()
    Catch ex As Exception
        Throw New ApplicationException( _
            "An error occurred while connecting.")
    End Try

    Try
    '*-----------------------------------------------------------------------
    '* Open cellset.
    '*-----------------------------------------------------------------------
        ' Create a new AdomdCommand object, providing the MDX query string.
        cmd = New AdomdCommand(strSource, conn)
        ' Run the command and return a CellSet object.
        cst = cmd.ExecuteCellSet()

    '*-----------------------------------------------------------------------
    '* Concatenate output.
    '*-----------------------------------------------------------------------

    ' Include spacing to account for row headers.
    strOutput.Write(vbTab, 6)

    ' Iterate through the first axis of the CellSet object and
    ' retrieve column headers.
    For i = 0 To cst.Axes(0).Set.Tuples.Count - 1
        strOutput.Write(cst.Axes(0).Set.Tuples(i).Members(0).Caption)
        strOutput.Write(vbTab, 4)
    Next
    strOutput.WriteLine()

    ' Iterate through the second axis of the CellSet object and
    ' retrieve row headers and cell data.
    For j = 0 To cst.Axes(1).Set.Tuples.Count - 1
        ' Append the row header.
        strOutput.Write(cst.Axes(1).Set.Tuples(j).Members(0).Caption)
        strOutput.Write(vbTab, 4)

        ' Append the cell data for that row.
        For k = 0 To cst.Axes(0).Set.Tuples.Count - 1
            strOutput.Write(cst.Cells(k, j).FormattedValue)
            strOutput.Write(vbTab, 4)
        Next
        strOutput.WriteLine()
    Next

    ' Display the output.
    Debug.WriteLine(strOutput.ToString)

    '*-----------------------------------------------------------------------
    '* Release resources.
    '*-----------------------------------------------------------------------
        conn.Close()
    Catch ex As Exception
        ' Ignore or handle errors.
    Finally
        cst = Nothing
        cmd = Nothing
        conn = Nothing
    End Try
End Sub