none
ADOMD.NET Auslesen der Kataloge und deren Cubes klappt nicht RRS feed

  • Frage

  • Hallo ich habe ein kleines Problem beim Auslesen der SchemaInformation von AnlysisServices.

    Ich möchte alle verfügbaren Kataloge eines Servers auslesen und dann für jeden Kataloge seine Cubes. Dafür habe ich folgenden Code geschrieben. Das Auslesen aller verfügbaren Kataloge geht. Nur aber wenn ich versuche für einen Katalog seine Cubes auszulesen, werden diese nicht gefunden.

    AdomdConnection conn = new AdomdConnection();
                    conn.ConnectionString = "DataSource=.\\RASQL;Provider=MSOLAP;";
                    conn.Open();
    
                    //DataSet für alle verfügbaren Kataloge
                    DataSet catalogs = conn.GetSchemaDataSet(AdomdSchemaGuid.Catalogs, null);
                    DataTable schemaTable = catalogs.Tables[0];
    
                    //Auslesen der Namen der Kataloge
                    foreach (DataRow row in schemaTable.Rows)
                    {
                        string s = row["CATALOG_NAME"].ToString();
    
                        //erstelle eine Restriktion
                        AdomdRestrictionCollection rest = new AdomdRestrictionCollection();
                        rest.Add(new AdomdRestriction("CATALOG_NAME", s));
    
                        //DataSet für alle Cubes des aktuellen Katalagos
                        DataSet cubes = conn.GetSchemaDataSet("MDSCHEMA_CUBES", rest);
                        DataTable smtC = cubes.Tables[0];
    
                        //Auslesen der Namen der Cubes im Katalog
                        foreach (DataRow rc in smtC.Rows)
                        {
                            string b = rc["CUBE_NAME"].ToString();
                        }
    
                    }
    
                    conn.Close();

    Mittwoch, 29. Februar 2012 23:13

Antworten

  • Hallo,

    welche Version von SSAS nutzt Du? Wenn es 2008 oder höher ist, kannst Du zum Testen direkt die DMV abfragen, um zu sehen, wann Du welches Ergebnis erhälst.

    SELECT *
    FROM $SYSTEM.MDSCHEMA_CUBES

    Ergebnis ist, das Du nur die Cubes aufgelistet, die in der Datenbank enthalten sind, ín der Du gerade angemeldet bist. Du kannst die Cubes nicht Datenbankübergreifend abfragen, das geht nicht.

    Das einfachste ist, wenn Du vor dem Abfragen der Cubes die Datenbank wechselst, das geht mitt conn.ChangeDatabase(s):

    AdomdConnection conn = new AdomdConnection();
    conn.ConnectionString = "Data Source=.\\RASQL;";
    conn.Open();
                
    //DataSet für alle verfügbaren Kataloge
    DataSet catalogs = conn.GetSchemaDataSet(AdomdSchemaGuid.Catalogs, null);
    DataTable schemaTable = catalogs.Tables[0];
    
    //Auslesen der Namen der Kataloge
    foreach (DataRow row in schemaTable.Rows)
    {
        string s = row["CATALOG_NAME"].ToString();
    
        //erstelle eine Restriktion
        AdomdRestrictionCollection rest = new AdomdRestrictionCollection();
        rest.Add(new AdomdRestriction("CATALOG_NAME", s));
    
        //Datenbank wechseln, um Cubes zu lesen.
        conn.ChangeDatabase(s);
    
        //DataSet für alle Cubes des aktuellen Katalagos
        DataSet cubes = conn.GetSchemaDataSet("MDSCHEMA_CUBES", rest);
        DataTable smtC = cubes.Tables[0];
    
        //Auslesen der Namen der Cubes im Katalog
        foreach (DataRow rc in smtC.Rows)
        {
            string b = rc["CUBE_NAME"].ToString();
        }
    
    }
    
    conn.Close();


    Olaf Helper
    * cogito ergo sum * errare humanum est * quote erat demonstrandum *
    Wenn ich denke, ist das ein Fehler und das beweise ich täglich
    Blog Xing

    • Als Antwort markiert Bender86 Donnerstag, 1. März 2012 09:33
    Donnerstag, 1. März 2012 08:49

Alle Antworten

  • Hallo,

    welche Version von SSAS nutzt Du? Wenn es 2008 oder höher ist, kannst Du zum Testen direkt die DMV abfragen, um zu sehen, wann Du welches Ergebnis erhälst.

    SELECT *
    FROM $SYSTEM.MDSCHEMA_CUBES

    Ergebnis ist, das Du nur die Cubes aufgelistet, die in der Datenbank enthalten sind, ín der Du gerade angemeldet bist. Du kannst die Cubes nicht Datenbankübergreifend abfragen, das geht nicht.

    Das einfachste ist, wenn Du vor dem Abfragen der Cubes die Datenbank wechselst, das geht mitt conn.ChangeDatabase(s):

    AdomdConnection conn = new AdomdConnection();
    conn.ConnectionString = "Data Source=.\\RASQL;";
    conn.Open();
                
    //DataSet für alle verfügbaren Kataloge
    DataSet catalogs = conn.GetSchemaDataSet(AdomdSchemaGuid.Catalogs, null);
    DataTable schemaTable = catalogs.Tables[0];
    
    //Auslesen der Namen der Kataloge
    foreach (DataRow row in schemaTable.Rows)
    {
        string s = row["CATALOG_NAME"].ToString();
    
        //erstelle eine Restriktion
        AdomdRestrictionCollection rest = new AdomdRestrictionCollection();
        rest.Add(new AdomdRestriction("CATALOG_NAME", s));
    
        //Datenbank wechseln, um Cubes zu lesen.
        conn.ChangeDatabase(s);
    
        //DataSet für alle Cubes des aktuellen Katalagos
        DataSet cubes = conn.GetSchemaDataSet("MDSCHEMA_CUBES", rest);
        DataTable smtC = cubes.Tables[0];
    
        //Auslesen der Namen der Cubes im Katalog
        foreach (DataRow rc in smtC.Rows)
        {
            string b = rc["CUBE_NAME"].ToString();
        }
    
    }
    
    conn.Close();


    Olaf Helper
    * cogito ergo sum * errare humanum est * quote erat demonstrandum *
    Wenn ich denke, ist das ein Fehler und das beweise ich täglich
    Blog Xing

    • Als Antwort markiert Bender86 Donnerstag, 1. März 2012 09:33
    Donnerstag, 1. März 2012 08:49
  • Hallo, vielen Dank für die schnelle Antwort. Das hat funktioniert jetzt.

    Ist es möglich, dass ich nur Kataloge abfrage wo nur Cubes und keine DataMining Strukturen sich befinden, ohne dass ich da viel mit If und etc arbeiten muss?

    Danke nochmal.

    Donnerstag, 1. März 2012 09:33
  • Wie ich schon schrieb, es gibt keine Möglichkeit Datenbank-übergreifend Informationen abzufragen. Selbst mit AMO müsstest Du durch alle vorhandene Datenbanken durch iterrieren und jedesmal prüfen.

    Olaf Helper
    * cogito ergo sum * errare humanum est * quote erat demonstrandum *
    Wenn ich denke, ist das ein Fehler und das beweise ich täglich
    Blog Xing

    Donnerstag, 1. März 2012 17:55
  • Ok, verstehe.

    Vielen Dank

    Sonntag, 4. März 2012 16:10