none
Kann ein Bericht auf ein Datenobjekt eines Webservice zugreifen? RRS feed

  • Frage

  • Ich habe eine Website und einen Webservice. Der Webservice holt  Daten aus einer Datenbank, die auf der Website ausgegeben werden.

    Jetzt möchte ich noch einen Bericht auf der Website anlegen, der auf die Daten des Webservice zugreift, da diese dynamisch geladen werden sollen (nur die Daten ausgeben, die eine bestimmte Bedingung erfüllen).

    Ich benutze den normalen ReportViewer.

    Nur ich kann nicht auf die Daten, die der Webservice aus der Tabelle holt, zugreifen. Wie kann ich das lösen? 

    Vielleicht kennt  jemand eine Möglichkeit mein Problem zu lösen, vllt sogar mit nem Codebeispiel.

    Vielen Dank im vorraus ..  
    Montag, 21. September 2009 12:32

Antworten

  • Hallo SkiZ,

    die einfachste Lösung ist, Du machst aus Deiner ArrayList einfach ein XmlDocument, dann hast Du auch eine gültige Datenquelle für den ReportViewer. Der Zugriff auf die Datenwerte erfolgt über XPath Ausdrücke.

    Ich weiss zwar nicht welche Datenbank Du benutzt, aber die meisten Datenbanken unterstützen die Ausgabe von Queries in XML-Format serienmäßig (z.B. der Microsoft SQL Server mit dem Autoxml Feature).

    Eine weitere Möglichkeit ist die Rückgabe eines DataSets anstatt einer ArrayList. Dann hast Du zwar die volle Datenquelle, schießt aber angesichts Deines minimalen Datenmodells etwas über Ziel hinaus.

    Schöne Grüße
    Oliver

    Montag, 21. September 2009 15:45
  • Hi,
    Das mit dem Dataset habe ich auch schon probiert. Nur das Problem ist das der Bericht in der Website keine Datenquelle aus dem Webservice akzeptiert bzw. findet. Daran scheitert es...
    und warum lädst Du das DataSet (bzw. was anderes) nicht per Code vom Webservice, hast damit also ein lokales Objekt und verwendest dieses als Datenquelle?

    Dim MyDataSource As DataSet|DataView|... = <WebService>.GetWasAuchImmer( ... )
        <Report>.... = MyDataSource

    http://msdn.microsoft.com/en-us/library/ms251824.aspx


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community
    Dienstag, 22. September 2009 08:34
    Moderator

Alle Antworten

  • Hallo SkiZ,

    es wäre ganz praktisch, wenn Du uns zeigen könntest wie Dein WebService aussieht. Dann könnte ich Dir auch sagen, was man besser  bzw. anders machen könnte.

    Schöne Grüße
    Oliver
    Montag, 21. September 2009 12:53
  • also:

    eine Nutzerklasse:
    namespace WebService1
    {
        public class clNutzer
        {
            public string name;
            public string vorname;
            public string email;
            public string telefon;
        }
    }
    In deren Objekte werden die Datensätze gespeichert.

    eine DB-Klasse:
    public class clDB
        {
            public SqlConnection Verbindung = null;
            public SqlDataReader dataReader = null;
            public SqlCommand Befehl = null;
            public string VerbString = ConfigurationManager.ConnectionStrings["ConString"].ConnectionString;
            
            public ArrayList readDB( string sQuery )
            {
                Verbindung = new SqlConnection(VerbString);
                Verbindung.Open();
                
                clNutzer Nutzer;
    
                ArrayList alNutzer = new ArrayList(); //speichert Datensätze
    
                Befehl = Verbindung.CreateCommand();
    
                Befehl.CommandText = sQuery;
    
                dataReader = Befehl.ExecuteReader();
    
                while (dataReader.Read())
                {
                    Nutzer = new clNutzer();
    
                    Nutzer.name = dataReader.GetString(1);
                    Nutzer.vorname = dataReader.GetString(2);
                    Nutzer.email = dataReader.GetString(3);
                    Nutzer.telefon = dataReader.GetString(4);
    
                    alNutzer.Add(Nutzer);
                }
                closeDB();
                
    
                return alNutzer;
            }
    }
    Sie ließt die Datensätze aus der Datenbank und gibt sie alles Arraylist zurück.

    Und der Webservice an sich:

    public class Service1 : System.Web.Services.WebService
        {
            private string sSelectQuery = "SELECT * FROM shd_nutzer ";
            private string sOrderQuery  = "ORDER BY name";
            private string sWhereQuery = "WHERE ";
            
            public Service1()
            {
                //String connStr = ConfigurationManager
                //clDB datenbank = new clDB(connStr);
            }
    
            [WebMethod] // holt sämtliche Datensätze aus der DB
            [XmlInclude(typeof(clNutzer))]
            public ArrayList getData(string Filter, string FilterKat, bool Check)
            {
                clDB Datenbank = new clDB();
    
                ArrayList alNutzer = new ArrayList(); //speichert Datensätze
    
                String sQuery = "";
                
                FilterKat = FilterKat.ToLower();
    
                // überprüft, ob Filter angewerdet werden soll
                if (Filter.Equals(String.Empty))
                { 
                    sQuery = sSelectQuery;
                    if (Check)
                        sQuery += sOrderQuery;
                }
                else
                {
                    if (Check == true)
                        sQuery = sSelectQuery + sWhereQuery + FilterKat + " LIKE " + "'%" + Filter + "%'" + sOrderQuery;
                    else
                        sQuery = sSelectQuery + sWhereQuery + FilterKat + " LIKE " + "'%" + Filter + "%'";
                }
    
                alNutzer = Datenbank.readDB(sQuery);
    
                return alNutzer;
            }
    }
    Der Webservice baut den Query für die Abfrage zusammen.

    Mien Problem ist halt das ich die Daten nicht als Datesource für einen Bericht nehmen kann.
    Montag, 21. September 2009 13:31
  • Hallo SkiZ,

    die einfachste Lösung ist, Du machst aus Deiner ArrayList einfach ein XmlDocument, dann hast Du auch eine gültige Datenquelle für den ReportViewer. Der Zugriff auf die Datenwerte erfolgt über XPath Ausdrücke.

    Ich weiss zwar nicht welche Datenbank Du benutzt, aber die meisten Datenbanken unterstützen die Ausgabe von Queries in XML-Format serienmäßig (z.B. der Microsoft SQL Server mit dem Autoxml Feature).

    Eine weitere Möglichkeit ist die Rückgabe eines DataSets anstatt einer ArrayList. Dann hast Du zwar die volle Datenquelle, schießt aber angesichts Deines minimalen Datenmodells etwas über Ziel hinaus.

    Schöne Grüße
    Oliver

    Montag, 21. September 2009 15:45
  • Das mit dem Dataset habe ich auch schon probiert. Nur das Problem ist das der Bericht in der Website keine Datenquelle aus dem Webservice akzeptiert bzw. findet. Daran scheitert es...
    Dienstag, 22. September 2009 06:50
  • Hi,
    Das mit dem Dataset habe ich auch schon probiert. Nur das Problem ist das der Bericht in der Website keine Datenquelle aus dem Webservice akzeptiert bzw. findet. Daran scheitert es...
    und warum lädst Du das DataSet (bzw. was anderes) nicht per Code vom Webservice, hast damit also ein lokales Objekt und verwendest dieses als Datenquelle?

    Dim MyDataSource As DataSet|DataView|... = <WebService>.GetWasAuchImmer( ... )
        <Report>.... = MyDataSource

    http://msdn.microsoft.com/en-us/library/ms251824.aspx


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community
    Dienstag, 22. September 2009 08:34
    Moderator
  • Hallo SkiZ,

    Haben Dir die Antworten weiter geholfen?

    Grüße,
    Robert

    Mittwoch, 28. Oktober 2009 12:03
    Moderator
  • Hallo SkiZ,

    Ich gehe davon aus, dass die Antworten Dir weitergeholfen haben.
    Solltest Du noch "Rückfragen" dazu haben, so gib uns bitte Bescheid.

    Grüße,
    Robert

    Mittwoch, 28. Oktober 2009 22:13
    Moderator