Zelle aus einer Datenbank-Tabelle auslesen

  • erstmal ein hallo an alle,

    ich programmiere c# in visual studio 2008 und suche jetzt schon eine ewigkeit nach einer
    lösung für mein problem:

    ich habe in einem Windows Forms Projekt eine tabelle in einer Datenbank und möchte
    eine bestimmte zelle daraus auslesen, also den darin enthaltenen wert in einer variable
    speichern. am liebsten würde ich einfach zeile und spalte angeben können.

    selber habe ich leider überhaupt keinen plan wie das gehen sollte und die meisten "lösungen"
    die in manchen anderen foren stehen verstehe ich nicht da ich zwar kein Anfänger bin mich
    aber auch nicht wirklich super auskenne.

    ich freue mich über jede antwort und ich hoffe ihr könnt mir helfen,

    lg shavari

  • Zitat

    ich habe in einem Windows Forms Projekt eine tabelle in einer Datenbank und möchte
    eine bestimmte zelle daraus auslesen, also den darin enthaltenen wert in einer variable
    speichern. am liebsten würde ich einfach zeile und spalte angeben können.

    .net bietet dir mehrere Möglichkeiten des Datenbankzugriffs. Je nachdem wie fit und motiviert du bist, kommen mehrere Lösungen in Frage. Die meisten Entwickler realisieren Datenbankzugriffe in .net mit dem ado.net entity framework, wenn du aber noch keine Erfahrung hast mit Datenbankapplikationen und du wirklich nur eine Zelle auslesen magst, würd's ein einfaches sql statement oder linq auch tun. (linq kann ich nur jedem sehr ans Herz legen btw)

    Wie schaut's denn aus, welchen Datenbankserver verwendest du? MS SQL 2005/2008, Oracle,...? Ist dir die Datenbankverbindung klar bzw. kannst du in der Applikation eine aufbauen? (Zugangsdaten) Hast du in der Applikation bis jetzt keine DB Verbindung gebraucht und willst du wirklich nur eine einzelne Zelle auslesen oder ist das nur der "hello world" test?

    Prinzipiell ist es voll easy, du musst nur sagen was du genau willst ;)

    :(){ :|:&};:

  • naja ich habe mit visual studio eine dienstbasierte datenbank erstellt und dort eine tabelle eingefügt und diese auch schon befüllt.
    dann habe ich diese datenbank als datenquelle hinzugefügt und in mein form gezogen. dort erstellt visual studio automatisch
    ein steuerelement mit der tabelle, in die man, wenn man das programm ausführt auch schon was eingeben und speichern kann.
    die datenbank befindet sich nachher im selben ordner wie die exe, also ich hab keinen server auf den ich mich verlinken will/muss.

    das ist eigentlich alles was ich bisher gemacht habe.
    dank visual studio musste ich bis jetzt noch keine zeile code für die tabelle schreiben.

    Einmal editiert, zuletzt von Shavari (18. April 2010 um 16:49)

  • Ich muss zugeben, ich hab bis jetzt noch nie eine solche DB verwendet, aber soweit ich das richtig verstehe benötigt eine service-based database immer einen SQL Server im Hintergrund. Da du mit VS entwickelst, wird VS dadurch automatisch im Hintergrund die DB am MS SQL Server Express anlegen und darauf connecten. Zum testen und lernen ist's ok, aber ansich macht's nicht so viel Sinn imho.

    Wenn du nur eine lokale DB brauchst, die wirklich nur für einen Benutzer benötigt wird, solltest eher eine local database verwenden (eigenes template im vs). Das ist ein anderes Format und benötigt keinen MS SQL Server, dafür hast halt keine Multiuserfunktionalität oder die ganzen Fähigkeiten von nem SQL Server.
    Wenn du ins Install-Projekt dann einen MS SQL Server Express mitpackst, oder du vorraussetzen kannst, dass die User einen lokalen SQL Express laufen haben, kannst du natürlich das service-based template verwenden, in dem Fall würde ich allerdings die DB direkt am Server anlegen (über das Management Studio oder den Server Explorer im VS). Theoretisch sollt's egal sein, mir ist dieser Weg über die templates nicht bekannt und kommt mir einfach ein wenig seltsam vor :)

    Soweit mal die Theorie, jetzt bissl zur Praxis:

    Ich bin ein Fan von LINQ (language integrated query) von daher werd ich dir nur den LINQ-Lösungsansatz zeigen.
    Wenn du die DB so angelegt hast wie ich atm glaube, dann sollte die bei dir im Server Explorer aufscheinen. Füg eine "Linq-to-SQL" Klasse deinem Projekt hinzu, default name is "DataClasses1.dbml". Der Designer geht auf und zeigt dir zuerst mal nichts. Aus dem Server-Explorer ziehst du jetzt alle Tabellen aus deiner Datenbank auf die weiße Fläche im Designer, VS generiert dir jetzt den DataContext. (die Klasse brauchst du um mit linq auf die DB zuzugreifen)

    Wenn du das hast, steht die Verbindung zur DB. Ab jetzt kannst du die DB aus deiner Applikation im Code ganz einfach ansprechen:

    Code
    using (DataClasses1DataContext dc = new DataClasses1DataContext())
                {
                    var res = (from customers in dc.tbl_Customers
                               where customers.CustomerId == 2
                               select customers.CustomerName).FirstOrDefault();
    
    
                    label1.Text = res;
                }

    Erklärung zum Code:

    Falls dir das using-statement nicht bekant ist: link
    Ich hab in meiner DB eine Tabelle tbl_Customers, "customers" ist der variablen name für die Tabelle im linq context (frei wählbar). Das tolle an LINQ ist, dass du IntelliSense während dem Schreiben der Query hast, also einfach immer fleißig "." drücken, dann findest dich schnell zurecht.
    Die Query würde dir jetzt einfach den Namen des Customers mit ID=2 zurückgeben.


    Zum Schluss noch: Ich bin mir nicht ganz sicher was du machen möchtest, von daher kanns sein dass ich nen völligen Schwachsinn geschrieben habe, in dem Fall tut's mir Leid :) Es gibt auch mehrere Möglichkeiten wie du dein Vorhaben realisieren kannst, ich bin halt wie gesagt ein Fan von LINQ. Ich würd dir auch noch raten nicht zu sehr die DataSource-Fähigkeiten der unterschiedlichen GUI Designer zu verwenden, zumindest nicht in dem Ausmaß, lieber per Hand coden, ist mit LINQ sowieso kaum Aufwand ;)

    btw: LINQ geht gegen object, sprich du kannst mit dem dementsprechenden Adapter auch jedes control, xml oder webdienste wie flickr ansprechen ;)
    btw2: später wäre dann linq-to-entity dem linq-to-sql vorzuziehen ;)

    :(){ :|:&};:

  • danke für diese ausführliche information, linq ist für mich völliges neuland aber ich werde mir das mal anschaun.

    es wäre praktisch wenn ich dafür keinen server benötige und keine anderen programme benötigt werden. also dass mein programm auch ohne internet funktioniert.es ist auch nur für einen benutzer gedacht.

    Vielleicht ist eine datenbank aber auch gar nicht nötig bei meinem vorhaben, denn ich brauche eigentlich nur eine tabelle in die ich was reinschreiben und dann auslesen kann.

  • So, nochmal kurz nachgelesen, leider find ich auf die schnelle nicht allzu viel Informationen zu local databases, vielleicht weiß sonst jemand mehr dazu?

    Wenn du ohne Server auskommen magst kannst du (theoretisch) eine local-database verwenden. Das Template erstellt dir dann eine *.sdf database die einen MS SQL CE verwendet, der dann entweder automatisch mit deiner Applikation mitkommt, oder bereits (was ich eher glaube) als ein Windows-Dienst auf jedem Rechner läuft. Darauf geb' ich jetzt keine Garantie, aber theoretisch sollte also jeder (Windows-) User eine solche DB abfragen können, sprich für dein Vorhaben völlig ok.

    Wenn wir das ganze weiterspinnen sollt's dann auch mit LINQ gehen wie im oberen Post beschrieben. (alternativ bleiben dir immer noch einfache sql statements)

    Als Alternative kannst du natürlich immer noch irgendein file für deine Daten verwenden (tab selected txt file, excel,...) Wenn du aus deiner Applikation raus aber Datensätze speichern möchtest (vor allem umfangreiche oder viele), würd ich dir stark zu einer Datenbank raten. Speicherst du hingegen nur configs oder einzelne Werte kann ein file durchaus auch Sinn machen.

    :(){ :|:&};:

  • ich habe meine tabelle jetzt in eine locale datenbank umgeschrieben (wieder mit vs automatisch) ich hab wieder keinen code selber geschrieben.
    eine locale datenbank scheint mir bei meinem vorhaben auch etwas besser geeignet zu sein.
    immerhin weis ich jetzt, dass ich noch keine verbindung zu meiner datenbank habe.
    müsste ich da zuerst ein neues objekt meiner datenbank erzeugen oder funktioniert das anders?

  • Hast du denn die neue DB im Server Explorer aufgelistet? Wenn ja, kannst du die Zugriffe wie 2 Posts zuvor mit LINQ realisieren. Einfach das "Linq to SQL" template verwenden und die Tabelle aus der neuen DB im Server Explorer reinziehen.

    Den Server Explorer findest du meist links im vs, ein- und ausblenden kannst du ihn unter View-Server Exlorer. VS sollte dir beim Erstellen der DB auch den Eintrag im Server Explorer erstellen.

    :(){ :|:&};:

  • ich hab die datenbank jetzt im "Server-Explorer" und ich hab sie auch schon in "Datenquellen", von dort hab ich sie ins Form gezogen.
    das bearbeiten vom der Form aus funktioniert perfekt aber wie geht das jetzt aus dem code heraus?

  • oh das hab ich vorhin grad überlesen, tut mir leid.
    ich hab grad versucht die tabelle aus dem server-explorer in die linq to sql klasse zu ziehen aber er hat mir einen fehler angezeigt: "Die ausgewählten Objekte verwenden einen nicht unterstützten Datenanbieter"
    was hab ich falsch gemacht?

  • Es hat sich herausgestellt dass LINQ nicht (von Haus aus) kompatibel zu einer SQL CE database ist, aber zum Glück gibt's da einen kleinen Umweg. link hier

    Wenn du diesen Anweisungen folgst kannst du dir den LINQ DataContext erstellen und dann im Code verwenden. Die Anleitung ersetzt dir somit die Punkte "Linq-to-Sql Klasse erstellen", "Tabellen aus dem Server Explorer in den Designer ziehen" aus meinem früheren Post.

    Ein wenig tricky, aber es funktioniert und du hast all die netten Vorteile von LINQ :)

    Wenn's Probleme gibt oder du später Fragen zu LINQ hast, einfach schreiben. ;)

    :(){ :|:&};:

  • vielen dank für die hilfe :) das funktioniert mit dem linq sehr gut, auch das erstellen geht gut aber funktioniert es mit dieser linq datenbank jetzt noch, dass ich so wie wenn ich eine vs datenbank aus den "datenquellen" auf mein form ziehe, so eine oberfläche bekomme? oder wenn es geht dann wie?

  • Du hast keine "linq database", was du hast ist eine DataContext Class, die benötigst du damit du deine database mit LINQ ansprechen kannst. Es handelt sich also nach wie vor um die gleiche database wie vorher. Es sollte also weiterhin möglich sein die database mit deinen Forms zu verwenden.

    Prinzipiell kannst und solltest du natürlich die gesamte Logik dahinter selbst nachbauen (später wirst du das so oder so machen müssen und nicht die Designer Funktionalitäten verwenden können), sprich den Code selbst schreiben um Daten aus der db zu laden oder neue Datensätze in die db zu speichern. Für Testzwecke ist's eh völlig ok sich damit zu spielen, nur ab einer gewissen Größe und Komplexität wirst du nicht daran vorbeikommen das selbst zu coden. Ich kann dich aber beruhigen, gerade mit LINQ und vorallem mit den DataBinding Funktionen von Silverlight oder WPF ist das später kaum ein Aufwand ;)

    :(){ :|:&};:

  • ok ich hab das jetzt mal eingebaut und es funktioniert so weit.
    so bekomme ich nämlich alle werte dieser spalte aber wie stelle ich es an das ich nur einen wert bekomme?
    mein code bis jetzt:

    wäre das dann das was du oben schon geschrieben hast?

    Zitat
    Code
    using (DataClasses1DataContext dc = new DataClasses1DataContext())
                {
                    var res = (from customers in dc.tbl_Customers
                               where customers.CustomerId == 2
                               select customers.CustomerName).FirstOrDefault();
    
    
                    label1.Text = res;
                }

    Einmal editiert, zuletzt von Shavari (20. April 2010 um 16:54)

  • Naja, irgendwie musst du ja wissen welchen Wert du aus der Tabelle haben möchtest.

    Wenn du wirklich nur einen beliebigen (den ersten) Wert aus der Tabelle lesen möchtest kannst du das LINQ statement einklammern und ein .FirstOrDefault() ranhängen. Aber ich schätz mal du meinst du brauchst einen bestimmten Wert aus der db. In dem Fall kannst du die Bedingungen im LINQ statement mit nem where reingeben:

    Code
    using (VölkerDatenbank db = new VölkerDatenbank("Völkerdatenbank.sdf"))
                {
                    var names = (from v in db.Volk
                                 where v.Kontinent.equals("Europa")
                                 where v.Sprache.equals("DE")
                                 select v.Name);
                }

    Ich geh mal davon aus dass du eh Keys in der database verwendest bzw Erfahrung im Umgang mit dbs hast?

    :(){ :|:&};:

  • ja genau das brauche ich :D
    nur wie schreib ich die var names jetzt in meine textBox1.Text?

    nein ich hab noch nie eine datenbank verwendet, ich weis leider auch nicht wozu keys da sind bzw. wozu man die brauchen kann.

    ich lerne in der schule gerade java, mit c# hab ich schon etwas länger erfahrung aber klassen kenne ich erst seit kurzem, daher meine "Unwissenheit".
    tut mir leid wenn ich lauter fragen stelle die so offensichtlich zu lösen sind.

  • in var names hast du ja alle Namen aus der Tabelle drinnen, ergo macht es wenig Sinn die alle in eine Textbox zu schreiben ;) Wenn du alle Namen auf einmal darstellen möchtest verwende ein Datagrid, wenn du nur einen bestimmten Namen in eine Textbox schreiben möchtest musst zu zunächst den Wert erhalten. (no na ned^^) Dafür brauchst du irgendeine Referenz für den Datensatz.

    Du hast ja in deinem ersten Post geschrieben, dass du eine _bestimmte_ Zelle in eine Variable speichern möchtest, wie gedenkst du die eine Zelle bestimmen zu können? Genau diese Bedingung musst du im LINQ statement einbauen und ein ().FirstOrDefault(); ranhängen, dann bekommst du den einen Namen.

    Am besten du postest mal wie deine Datenbank aufgebaut ist und was du jetzt genau machen möchtest, dann kann man dir auch leichter helfen.

    :(){ :|:&};:

  • Also ich habe eine Datenbank namens: "VölkerDatenbank.sdf"
    in dieser befindet sich eine Tabelle namens: "Volk"
    mit den Spalten wie im Bild sichtbar (ein Paar Daten sind schon eingefügt)
    informatik-forum.net/attachment/16591/

    Daraus möchte ich jetzt zum Beispiel in der Spalte "Name" den Wert aus der Zeile 7: "Marapén" in eine TextBox oder eine String Variable schreiben. die Linq klasse heißt: "VölkerDatenbank.dbml"

  • Ok, andersrum gefragt: woher weiß deine Applikation zur Laufzeit, dass sie den "Marapén" Datensatz laden soll? Scheinbar ist ja "Name" dein key in der Tabelle (ob jetzt primary gesetzt oder nicht). Von daher macht's ja keinen Sinn den Wert extra auszugeben, den Namen musst du in dem Fall ja sowieso wissen (sei's durch Auswahl des Users aus einer Liste oder hardcoded)

    Vielleicht lässt's sich am Code besser veranschaulichen:

    Code
    var res = (from v in dc.Volk
                   where v.key == meinGewählterKey
                   select v.dasFeldDasIchHabenMöchte).FirstOrDefault();

    Deinem letzten post nach wäre das ein

    Code
    var res = (from v in dc.Volk
                   where v.name.equals("Marapén")
                   select v.name).FirstOrDefault();

    Die Abfrage würde somit keinen Sinn machen, da du bereits vor der Abfrage den Namen wissen musst.

    Die Applikation muss ja, wenn sie einen bestimmten Datensatz ausgeben soll, wissen, woran sie diesen Datensatz erkennt. Normalerweise verwendet man dazu in der Datenbank integers die sich automatisch inkrementell erhöhen (eine abhängig von der Situation bessere Lösung sind GUIDS), dazu musst du das Feld im VS oder Mangement Studio als "is identity" oder so ähnlich markieren, gleichzeitig auch noch als "primary key", damit die Datenbank weiß, dass sich die Datensätze anhand dieses keys unterscheiden lassen.

    Es bleibt also die Frage: woher weiß deine Applikation dass sie diesen einen bestimmten Datensatz laden soll? Hast du eine Liste mit allen Völkernamen und möchtest einfach per Auswahl den dazugehörigen Datensatz laden? Oder willst du einfach ziellos durch die Datensätze navigieren können?

    Ich würd dir raten dir ein paar Texte, Tutorials, eBooks was auch immer über Datenbanken durchzulesen. Weil entweder du drückst dich falsch aus, oder ich verpeil's einfach es richtig zu lesen, oder ich verpeil's mich richtig auszudrücken (durchaus wahrscheinlich^^) oder dir fehlen die Grundkenntnisse ;)

    :(){ :|:&};:

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!