C# [und Silverlight] Datagrid mit Daten aus der DB befüllen

tonikln

Lt. Junior Grade
Registriert
Aug. 2005
Beiträge
314
Hallo zusammen,

ich versuch Daten aus der Datenbank in einen DataGrid zu laden.
Bei mir läuft der SQL Server 2008.


Wie bekomm ich denn die Daten von der DB in meiner silverlight webanwendung ?
Ich brauch irgendwie die schnittstelle zwischen silverlight(c#) und den SQL Server.


Hat jemand zufällig beispiele oder änliches?

Danke im Voraus
 
Ich kenne mich nicht mit Silverlight aus, aber es sollte so gehen wie in C#, dass du der DataGridView.DataSource ein DataSet übergibst. Das füllst du mit den Daten aus der Datenbank, mit Hilfe eines DataAdapters. Guckst du MSDN, findest du eigentlich alles.

Eine elegantere Lösung wäre, das ganze per LINQ zu realisieren.
Da kannst du nach LINQ-to-SQL.

Dazu ist hier eine recht gute Beschreibung!


Ich hoffe es sind ein paar gute Anhaltspunkte, mit denen du arbeiten kannst, bzw. es dir erarbeiten kannst. ;)

// edit:

... sorry, habe ich mich geirrt, das geht anscheinend doch nicht so leicht in Silverlight.
 
Zuletzt bearbeitet: (Fehlangaben...)
@tonikln:

Du musst dir über die Grundstruktur von Silverlight klar werden.
Es gibt das Frontend, das ist das was der User später sieht, und diese Frontend kommuniziert mit einem Webserver über WCF Services.
In deinem Webserverprojekt(was durch Silverlight meistens mit erstellt wird) musst du eine Logik anlegen die dir die Daten aus der Datenbank holt(Siehe Beitrag HaGGi.13).
Im nächsten Schritt würde ich mir extra Klassencontracts anlegen die deine Daten aus der Datenbank nochmals Wrappen.
Nun legst du einen Service an mit welchem du diese Daten zur Verfügung stellst, diesen Service musst in deinem Silverlight projekt als Dienstreferenz einbinden und dann kannst du über diesen Service auf die Funktionen zugreifen.
Die geholten Daten kannst du dann, auch wie wie HaGGi.13, sagte in einem Datagrid ganz easy anzeigen. Da Silverlights Frontend WPF basierend ist, ist es hier sehr hilfreich die Daten in eine ObservableCollection<T> zu packen und die and die Datasource des Grids zu packen.

Wichtig dabei zu beachten ist, Silverlights WCF Services sind asynchron, d.h. du brauchst immer einen Eventhandler sobald der Funktionsaufruf beendet ist.
Sollte kein Thema sein.

Ich hoffe ich habe dir nicht zu viel erzählt was du vielleicht schon wusstest, und konnte dir bei deinem Problem etwas helfen. Ansonsten frag einfach nochmal nach.
 
Also kurzgefasst heißt das jetzt folgendes:

Silverlight Projekt anlegen --> Ein Button erstellen, der dann mit dem WCF Dienst kommuniziert.

WCF Dienst: Macht die grundsätzliche Arbeit d.h. sieht zu, dass meine Daten aus der DB in meinem DataGrid ausgespuckt werden

Hab ich das jetzt richtig verstanden :freak::freaky: ?
 
1. Punkt richtig verstanden.
2. Punkt leider nicht.

Der Dienst ist dazu zuständig um die die Daten von der Datenbank bereitzustellen.

D.h. es gibt in deinem Webprojekt des Silverlightprojekts einen Dienst, und der implementiert die Logik des holen der Daten über LINQ-To-Sql.

In deiner Silverlight anwendung, rufst du dann die Funktion dieses Dienste auf und die sollte dir am besten eine IEnumerable<DeinDatenTyp> zurückgeben. Diese IEnumerable<T> castest du einfach in eine ObservableCollection<T> und knallst die in deine DataSource des Grids.
 
immerhin die hälfte verstanden :D

hast du vllt einen beispielcode ?
ich verseh nämlich gerade nur bahnhof :(
 
Hallo zusammen,
nach langer Zeit habe ich es endlich geschafft, einen kleinen schritt nach vorn zu machen.

Ich habe es geschafft eine verbindung zur db zu erstellen (mit WCF Dienst).

Mein Problem ist jetzt, dass ich die Rückgabe von den WCF nicht in meiner Datagridview rein bekomme :(

Mein Code sind folgend aus:

Code:
    // HINWEIS: Wenn Sie hier den Klassennamen "Service1" ändern, müssen Sie ebenfalls den Verweis auf "Service1" in "Web.config" und in der zugeordneten SVC-Datei aktualisieren.
    public class Service1 : IService1
    {
        //Initialisierung der Methode dbInfo
       public List<Person> dbInfo()
        {
            //Neues Objekt wird erzeugt
            datenbankDataContext db = new datenbankDataContext();

            var query = from q in db.Person select q;
            return query.ToList(); 

           // Ich denke hier hab ich alles richtig gemacht
        }
    }

Nun in meiner anderen klasse habe ich folgendes:
Code:
        private void Search_Click_1(object sender, RoutedEventArgs e)
        {

            //Was soll hier rein, damit meine Datagridview gefüllt wird ?
            //dgAusgabe.SetValue = ;  
        }


Hat jemand eine Idee

MfG
tonikln
 
Hast du den Service unter Services References in deiner Silverlightanwendung eingebunden?
Wenn ja solltest du wie foilgt drauf zugreifen können.

Code:
public void OnClick(object sender,EventArgs args)
{
    //Der Name der ServiceReference je nachdem wie du sie eben genannt hast
    Service1Client client = new ServiceClient();
    client.dbInfoCompleted +=(s,e)=>{dgv.DataSource = e.Result as ObservableCollection<Service1Reference.Person>;}
    client.dbInfoAsync();
}

Aufgrund der Tatsache das WCF Service Methodenaufrufe Asynchron sind, brauchst du immer einen Eventhandler wenn die MEthode beendet wurde. Ich habe das jetzt hier mit einer impliziten Lambdaanweisung gemacht, doch du kannst das auch über einen normalen Eventhandler in form einer expliziten Methode machen.
Der WCF Service Provider hängt an deine Methoden immer ein "Asyn" ran, damit erkennbar ist das der Methodenaufruf Asynchron ist.
 
Hi
wo muss denn dieser Code hin was du gepostet hast ?? ich versteh langsam garnix mehr :(
 
leider geht das nicht :(
ich hab ein haufen fehler die angezeigt werden wenn ich den Code da rein kopiere

gibt es keinen tutorial die silverlight mit WCF und DB verbinden und die Daten in eine DataGrid laden ??

hab schon danach gesucht, aber leider kommt nix #:(
 
-.- Wenn du den Code 1:1 übernommen hast ist doch klar das es da fehler gibt. Lies doch meine Posts auch genau.
Frage war: Hast du den Service als Service Reference in deiner Silverlight anwendung eingebunden? Wenn ja, wie heißt deine Service Reference da?

Als nächstes müsstest du dann meinen Service1Client durch den namen deines eingebundenen Services ersetzen, es kann außerdem gut sein das die MEthoden nicht 1:1 genauso heißen wie ich es gepostet habe, da musst du einfach mal deine Augen auf machen und richtig gucken ;)
Eventuell wäre es angebracht sich über die Grundlogik von Silverlight erstmal gedanken zu machen, mir scheint so als wenn das noch nicht richtig verstanden wurde.
 
das ist ja das problem
ich hab das unbenannt was falsch war und da zeigt der mir auch immer die fehler an :D
Ergänzung ()

Hallo zusammen,

hab dasProbelm nun gelöst :)

Code:
        void client1_dbInfoCompleted(object sender, db_mit_seba.ServiceReference1.dbInfoCompletedEventArgs e)
        {
            dgAusgabe.ItemsSource = e.Result;
        }

        private void btnSearch_Click(object sender, RoutedEventArgs e)
        {
            ServiceReference1.Service1Client client1 = new ServiceReference1.Service1Client();
            client1.dbInfoCompleted += new EventHandler<db_mit_seba.ServiceReference1.dbInfoCompletedEventArgs>(client1_dbInfoCompleted);
            //client1.dbInfoAsync();
        }

Aber habe leider ein anderes Problem und zwar bekomme ich keine Daten in meiner Datagridview, ich bekomm auch keine Fehlermeldung o.ä. :(

Hat jemand eine Idee woran das liegen könnte ??:(
 
Jo ist mir ganz klar, du solltest die Funktion schon wieder einkommentieren, sonst wird sie doch nicht ausgeführt -.-

Hier hab ich dir mal noch was von meinem Blog rausgesucht, worauf du sicherlich auch bald stoßen wirst, wenn du deine Anwendung auf einem anderen Server hosten willst.

Dynamische Endpoints
 
Ich habs endlich geschafft ;) dank toeffi ;)
 
Zurück
Oben