locked
Silverlight - Select auf Datenbank per WebService RRS feed

  • Frage

  • Hallo Zusammen...

    Ich bins nochmal  :-)

    Ich habe meiner WebAnwendung ein ADO.NET Entity Data Model und einen ADO.NET WebService hinzugefügt.
    Diesen habe ich dann der Silverlight Anwendung als Service Reference hinzugefügt.
    Wie schaffe ich es nun einen Select/Insert Into/Update... Befehl zu realiesieren das mir z.B. Daten aus der DB angezeigt werden?
    Habe zwar schon gegoogelt aber leider nichts brauchbares gefunden.

    Könnten ihr mir da weiterhelfen? Für ein Bsp. oder Link wäre ich sehr dankbar. :-)

    Grüße ThunderBold
    Mittwoch, 26. August 2009 12:09

Antworten

  • Hallo Oliver,

    das macht gar nichts denn wie Du siehst war ich selbst ein paar Tage nicht Online.
    Ich danke Dir für deine Mühe und werde es dann über den ADO.NET Data Service machen.

    Danke für das Angebot aber das kann ich nicht.


    Viele Grüße Giuseppe
    • Als Antwort markiert ThunderBold Mittwoch, 9. September 2009 09:47
    Mittwoch, 9. September 2009 09:47

Alle Antworten

  • Geh mal in die Silverlight-Hilfe -> Inhalt -> Data Access and Data Structures -> ADO.NET Data Services (Silverlight)

    Dort ist der gesamte Ablauf beschrieben.

    Wenn du anstelle eines WCF-Servuices einen XML Webservice nutzen willst, dann frage nochmals nach.

    --
    Peter
    Mittwoch, 26. August 2009 13:16
  • Hallo ThunderBold,

    ich gehe mal davon aus das Du ADO.NET Data Services (also WCF) meintest. Dazu gab es einen guten Artikel im Dotnet Magazin, denn Du online hier abrufen kannst:

    http://www.trivadis.com/fileadmin/user_upload/PDFs/Trivadis_in_der_Presse/dotnetMagazin_SilverlightADO_HUB_090701.pdf

    Einen Link zum Quellcode des Beispiels findest Du innerhalb des Artikels.

    Schöne Grüße
    Oliver
    Mittwoch, 26. August 2009 13:24
  • Hallo Peter, Hallo Oliver.

    Hat zwar etwas gedauert aber ich habe es nun endlich geschafft. Danke für die Hilfe.

    Jedoch habe ich nun noch eine Frage bzgl. des Bsp. von Peter.

    ' Define the filter condition based on the customer ID.
    
    
        Dim
     filterExpression = "CustomerID eq '"
     & Me
    .customerId.Text & "'"
    
    
        ' Define a query to return the specifed customer and related orders.
    
    
        Dim
     query As
     DataServiceQuery(Of
     Customers) = _
    svcContext.Customers() _
    .AddQueryOption("$filter" , filterExpression).Expand("Orders" )
    Mit der ersten Anweisung wird die Bedingung (also die Where Klausel gesetzt) und das Query ist nun die Abfrage. Jedoch verstehe ich diese Anweisung nicht wirklch. Könntet ihr mir diese vllt. erklären?

    Zudem wollte ich fragen ob man mit Silverlight nicht auch Linq Abfragen wie:

    "Dim Abfrage = From Kunden In db.Kunden..."

    realisieren kann, denn das wäre viel einfacher.

    Beste Grüße

    Dienstag, 1. September 2009 05:44
  • Da ich bisher keine Projekte projekte mit WCF habe (Anwender setzen nur FW 2 ein), habe ich auch nur wenig Erfahrung damit. Meine Silverlight-Projekt arbeiten alle mit XML WebServices. Da nutze ich in Silverlight LinQ auf die Liste, die vom WebService empfangen wurde.

    --
    Peter
    Dienstag, 1. September 2009 06:00
  • Hallo ThunderBold,

    was genau an der Filterkonstruktion verstehst Du nicht?

    AddQueryOption tut folgendes:

    1. Erweitert die Abfrage auf "Orders" um eine Where - Bedingung namens $filter

    wobei

    2. filterExpression den Wert von $filter darstellt.

    Wenn Du weitere Informationen suchst, dann schau mal hier:

    http://www.cloudcasts.net/Default.aspx?category=ADO.NET%20Data%20Services

    Zur zweiten Frage: Ja, du kannst auch LinQ - Abfragen in Silverlight realisieren. Dann brauchst Du aber keinen ADO.NET DataService, sondern kannst Peters Vorschlag mit WebService aufgreifen.. Mir persönlich ist aber der ADO.NET DataService lieber.

    Schöne Grüße
    Oliver
    Dienstag, 1. September 2009 09:51
  • Hallo Oliver,

    vielen Dank für die kurze Erklärunng und den Link.

    Ich hätte nun noch ne kurze Frage zu der Linq Abfrage.  Diese sieht bei mir so aus:

    Dim service as New Entities(New Uri("http://...")
    Dim Kunde= From K in service.Kunden where K.ID = 1

    Diese übergebe ich dann ans Grid mit:

    DataGrid.ItemSource = Abfrage.

     

    Will ich die Daten nun anzeigen erhalte ich folgenden Fehler:

    "Die angegebene Methode wird nicht unterstützt."


    Beim googeln habe ich nur dies hier gefunden:

    http://support.microsoft.com/kb/225342/de

    was aber nicht sein kann (da meine URL nicht so lange ist).

    Weiß vielleicht jemand woran das liegen kann?

    Grüße TB

    Dienstag, 1. September 2009 14:37
  • NAbend Oliver,

    nun habe ich noch eine Frage.
    Ich verwende die Linq Abfragen da die Befehle ja für verschiedene Datenbanken verwendet werden können.
    Ist dies mit dieser Abfrage Art ebenfalls möglich?
     Dim
     query As
     DataServiceQuery(Of
     Customers) = svcContext.Customers().AddQueryOption("$filter"
    , filterExpression).Expand("Orders"
    )
    Was für eine Art (wie z.B. Linq) von Abfrage ist dies eigentlich?

    Danke für die Hilfe.

    Grüße TB
    Dienstag, 1. September 2009 19:29
  • Hallo ThunderBold,

    zu Deiner ersten Mail hätte ich die Bitte, dass Du etwas mehr von Deinem Code zeigst. Ich sehe momentan den Zusammenhang zwischen dem Code und der Fehlermeldung nicht.

    Zu der Mail2. Dies ist in Prinzip gar keine Abfrage, sondern eine Konstruktion ähnlich dem DataReader-Objekt. Solchen Code findet man als Bestandteil von ADO.NET Data Services. Inhaltlich zur Abfrage wird es durch svcContext und durch den Expand - Befehl. Eingegrenzt wird die Abfrage durch AddQueryOption. Diese Teile werden aber seperat definiert oder sind Bestandteil eines referenzierten ADO.NET Entity Models. Wenn man aber trotzdem einen Abfragetyp festlegen will: Dies ist ein Select Statement mit Where - Bedingung.

    Das war es erstmal von mir

    Schöne Grüße
    Oliver

    P.S. Teil 2 meiner Antwort ist bestimmt nicht sauber definiert. Also bitte nicht überbewerten.

    Mittwoch, 2. September 2009 08:38
  • Hallo Oliver,

    hier ist der Code den ich geschrieben habe:

    Private Sub btnKommen_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs)

    Dim service as New Entities(New Uri("http://...")

    Dim Kunde = From K in service.Kunden where K.ID = 1

         'DataGrid.ItemsSource = "Es geht doch".Split    <- So erhalte eich eine Ausgabe 


          DataGrid.ItemsSource = Abfrage                    <- und hier erhalte ich den Fehler

    End Sub

    Ich erhalte den Fehler auch wenn ich die Abfrage als Liste ausgeben möchte...

    Hoffe das du damit etwas anfangen kannst. Danke Dir schon mal sehr!!!



    Hab ja ganz Teil 2 vergessen :-).

    Danke für die Erklärung das hat mir schon sehr geholfen. Falls du auch nicht herausfinden solltest woran der Fehler liegt werde ich diese konstruktion verwenden um meine Abfragen zu gestalten...



    Grüße Giuseppe
    • Bearbeitet ThunderBold Mittwoch, 2. September 2009 09:00 Hab Teil 2 vergessen ;-)
    Mittwoch, 2. September 2009 08:54
  • Hallo Guiseppe,

    das Binding einer direkten Abfrage an ein DataGrid geht nicht. Du musst die Ergebnisse Deiner Abfrage in einen Collection-Typ (z.B. List) laden.

    Schöne Grüße
    Oliver
    Donnerstag, 3. September 2009 08:26
  • Hallo Oliver.

    Also wenn ich es so umsetzte, erhalte ich in der Abfrage schon den selben Fehler wie zuvor.

    ...

    Dim Kunde = (From K in service.Kunden where K.ID = 1).toList                      <- "Die angegebene Methode wird nicht unterstützt."

          DataGrid.ItemsSource = Kunde
    ...

    Geht es auch anderst und wenn ja könntest du mir dies vllt. an einem kleinen Beispiel zeigen?


    Vielen Dank.

    Gruß Giuseppe
    Donnerstag, 3. September 2009 09:49
  • Hallo Giuseppe,

    mit toList produzierst Du hier garnichts. Schau Dir nocheinmal das Beispiel für den ADO.NET Data Service in der Silverlight Doku an.

    Dim returnedCustomer = query.EndExecute(currentResult).FirstOrDefault()
    
            If returnedCustomer IsNot Nothing Then
    
                
                For Each order As Orders In returnedCustomer.Orders
    'hier werden die Ergebnisse der Query zur Collection hinzugefügt ordersBindingCollection.Add(order) Next

     

    Die Konstruktion mußt Du nur umbauen (statt der Query nimmst Du deine Abfrage).

    Schöne Grüße

    Oliver

    Donnerstag, 3. September 2009 11:52
  • So Oliver ich habe es mir nochmals angeschaut und wie folgt umgesetzt (jedoch bin ich mir nicht sicher ob ich das so ganz richtig gemacht habe):


    Dim service as New Entities(New Uri("http://...")

    Dim Kunde = From K in service.Kunden

    If Kunde IsNot Nothing Then

                For Each K As Kunden In Abfrage               <- Nun erhalte ich hier den Fehler ?!?

                    KundenBindingCollection.add(F)

                Next

    End If

    DataGrid.ItemsSource = Kunde


    Und hier habe ich nun wieder diesen Fehler )-;


    Kannst du sagen was ich flasch gemacht habe?


    gruß Giuseppe


    Donnerstag, 3. September 2009 13:14
  • Hallo Guiseppe,

    nicht ganz richtig umgesetzt.  An die DataGrid.ItemSource gehört ein Collection-Type (in deinem Fall also die KundenBindingCollection). Außerdem müsste es heissen:

    If Kunde IsNot Nothing Then

                For Each K As Kunden In Kunde               
                    KundenBindingCollection.add(K)

                Next

    End If

    Schöne Grüße
    Oliver

    Donnerstag, 3. September 2009 15:24
  • Hallo Oliver,

    mein Block sieht auch so aus wie du es verbessert hast:


    If Kunde IsNot Nothing Then

                For Each K As Kunden In Kunde
                    KundenBindingCollection.add(K )

                Next

    End If

    Das "Abfrage" und "F" waren nur Schreibfehler, da ich auch schon andere Abfragen geschrieben habe habe ich das gemischt. Der Fehler tritt in der Zeile
    "For Each K as Kunden in Kunde..." leider trotzdem auf.

    Kann es für mein Problem vllt. auch noch eine andere Ursache geben?


    Grüße Giuseppe
    Freitag, 4. September 2009 05:30
  • Hallo Guiseppe,

    ich werde die ganze Sache mal durchtesten. Dies wird aber etwas Zeit in Anspruch nehmen. Ich melde mich später wieder.

    Schöne Grüße
    Oliver
    Freitag, 4. September 2009 07:37
  • Halllo Oliver,

    dafür Dnke ich Dir jetzt schonmal :-).

    Hier noch eine kurze Info, die vllt. hilfreich ist:

    Habe VS08 Prof. in Englischer Version installiert und die Silverlight Tools dementsprechend auch in Englisch sowie die Englische SDK.


    Grüße Giuseppe
    Freitag, 4. September 2009 08:06
  • Hallo Giuseppe,

    sorry für die verspätete Antwort. Eine fehlerfreie Lösung habe ich nicht hingekriegt. Meiner Ansicht nach, lassen sich die Elemente vom ADO.NET Data Service und LINQ nicht vermischen. Bleib beim ADO.NET Data Service (siehe Vorlage in der Silverlight Doku). Dies ist die eleganteste Lösung.

    Du kannst wenn Du willst und wenn Du die Möglichkeit hast, mir Dein Projekt irgendwo im Internet zum Download bereitstellen. Dann schaue ich gerne nocheinmal, ob es sich nicht um einen simplen Fehler handelt denn wir beide einfach übersehen haben.

    Schöne Grüße
    Oliver

    Dienstag, 8. September 2009 08:03
  • Hallo Oliver,

    das macht gar nichts denn wie Du siehst war ich selbst ein paar Tage nicht Online.
    Ich danke Dir für deine Mühe und werde es dann über den ADO.NET Data Service machen.

    Danke für das Angebot aber das kann ich nicht.


    Viele Grüße Giuseppe
    • Als Antwort markiert ThunderBold Mittwoch, 9. September 2009 09:47
    Mittwoch, 9. September 2009 09:47