Am 14. September 2017 haben wir eine überarbeitete Fassung unserer Datenschutzrichtlinie veröffentlicht. Wenn Sie video2brain.com weiterhin nutzen, erklären Sie sich mit diesem überarbeiteten Dokument einverstanden. Bitte lesen Sie es deshalb sorgfältig durch.

Visual C# 2011 Grundkurs

Daten abfragen

LinkedIn Learning kostenlos und unverbindlich testen!

Jetzt testen Alle Abonnements anzeigen
Um Daten von einem SQL Server abzufragen, können Sie die Datenklassen von ADO.NET benutzen.
10:13

Transkript

Wir schauen uns jetzt einmal an, wie wir Daten, die in unserer Datenbank stehen, mit C-Sharp auslesen können. Dazu habe ich schon mal eine Datenbank vorbereitet, die in unserem lokal installierten SQL-Server läuft, das ist die Datenbank "Contact Manager": 2 Tabellen, einmal "Category" und "Kontakt", und in "Contact" stehen bereits Daten drin, das ist einmal mein Datensatz und der Datensatz von Golo. Und in "Category" stehen ebenfalls 2 Kategorien, "Freunde" und "Kunden". Und wenn wir uns das Datenbank-Diagramm hier oben mal anzeigen, sieht man, dass zwischen der Tabelle "Kontakt" und der Tabelle "Category" eine Beziehung besteht, und das ist realisiert durch den Frame-Schlüssel "Category" und den Primär-Schlüssel "ADI" von der Tabelle "Category". Wenn wir Daten in unserer C-Sharp-Anwendung anzeigen wollen, dann nutzen wir die Datenklassen von "ADO.NET". "ADO.NET" ist die Datenbank-Technologie innerhalb von ".NET". Wir beginnen zunächst mit einer speziellen Klasse, und zwar ist das die SQL-Connection-Klasse. SQL-Connection ist eine Klasse, diese Klasse stellt quasi die Funktionalitäten zur Verfügung, um sich mit einem SQL-Server von Microsoft zu verbinden. Wir nennen das Objekt mal "Connection" und sagen hier "new SQL connection". Dieses SQL-Connection-Objekt erwartet jetzt entweder bei Instanziierung oder später einen sogenannten Connection-String. Connection-Strings ist ein normaler String, und in diesem String stehen bestimmte Parameter drin. Diese Parameter braucht "ADO.NET" um eine Verbindung zur Datenbank aufbauen zu können. Deswegen geben wir hier mal einen Connection-String an und erstellen hier oben eine Variable, die ebenso heißt. Dieser Connection-String muss ja jetzt irgendeinen Wert haben. Dieser Wert ist nicht immer ganz einfach zu bestimmen, weil das ein relativ kryptischer Ausdruck ist so ein Connection-String. Deswegen gibt es da eine Behilfsseite. Das ist die Seite www.connectionstrings.com, dort gibt es dann verschiedene Kategorien; da nehmen wir dann als Kategorie den "SQL-Server 2008". Hier sehen Sie, diese Connection-Strings auswendig zu wissen ist schon nicht ganz so einfach, und man vertippt sich auch ziemlich schnell. Deswegen gibt es hier auf dieser Seite von diesen Connection-Strings ein paar vorgefertigte in den unterschiedlichsten Varianten. Für uns ist die Variante interessant mit der "trusted connection", das heißt also, dass wir die Windows Benutzer-Authentifizierung benutzen, und den kopieren wir uns jetzt einfach mal. Hier an dieser Stelle fügen wir den Connection-String dann einmal wieder ein und schauen uns diesen Connection-String mal genau an. Am Anfang müssen wir eine "data source" angeben. "Data source" ist quasi eine Adresse zum SQL-Server. Da wir eine lokale Instanz verwenden, reicht es, wenn wir hier einen Punkt angeben. Dann müssen wir den Initial-Catalogue angeben. Das ist quasi die Datenbank, auf der wir später unsere Abfragen durchführen wollen. Bei uns ist das eben der Contact Manager. Damit ist quasi oben in dem Connection-String alles enthalten, was wir brauchen, um jetzt eine Verbindung zur Datenbank aufzubauen.  Wenn wir jetzt hier später so eine SQL-Verbindung aufbauen, dann müssen wir diese SQL-Verbindung irgendwann auch wieder schließen. Ansonsten benutzt man Ressourcen auf dem Server, die anderweitig genutzt werden können. Dieses Schließen von der Verbindung vergisst man aber ganz gerne mal. Es kann auch sein, dass es während dem Ausführen von unseren SQL-Statements später zu einem Fehler kommt und dann durch unsere Programmierung die Verbindung nicht wieder geschlossen wird. Das ist immer sehr ärgerlich, deswegen gibt es in C-Sharp dazu ein sogenanntes "using statement". Beim "using statement" gebe ich das kritische Objekt - nenne ich es jetzt mal - hinten in diesen runden Klammern an, und dadrunter habe ich so einen Anweisungsblock. In diesem Anweisungsblock kann ich jetzt mit diesem Connection-Objekt machen was ich will, und wenn der Anweisungsblock irgendwann verlassen wird, dann wird auf dieses Connection-Objekt die sogenannte Dispose-Methode aufgerufen. "Dispose" heißt, dass normalerweise alle ungenutzten Ressourcen frei gegeben werden. Jetzt speziell hier bei der SQL-Connection-Klasse heißt es, dass eben die Datenbankverbindung geschlossen wird. Wir können jetzt hier direkt mal oben hin gehen und diese Connection öffnen; das machen wir mit der Methode "open". Und schon ist die Verbindung zum SQL-Server geöffnet. Wir setzen einmal einen Breakpoint hier in diese Zeile, und dann wird die Verbindung ja geöffnet sein und Sie sehen, das funktioniert. Auch am Debugger können wir uns hier anschauen, das beim "state" steht "open"; also diese Datenbankverbindung wurde geöffnet. Wenn ich jetzt hier aus diesem Block raussteppe, dann ist diese Datenbankverbindung wieder geschlossen, weil auf diesem Connection-Objekt eben diese Dispose-Methode aufgerufen wurde, die diese Datenbankverbindung wieder schließt.  Wir bauen jetzt mal ein sogenanntes SQL-Statement zusammen. SQL-Statements sind eine bestimmte Sprache, die die Datenbank versteht. Und in dieser Sprache können wir der Datenbank sagen, welche Daten wir haben möchten. Solche SQL-Statements verpacke ich in C-Sharp, bzw. unter ".NET", speziell "ADO.NET" immer in einem sogenannten SQL-Command. Dieses SQL-Command - auch wieder eine ganz normale Klasse - ohne Parameter im Konstruktor. Und in diesem Command-Objekt muss ich jetzt zunächst eine Connection setzen, also auf welcher Verbindung nachher dieses SQL-Command ausgeführt wird; das ist natürlich unsere Connection, die wir hier oben aufgebaut haben. In dem Property "command text" speichern wir das Statement, was ausgeführt werden soll, gegen diese Datenbank. Ohne Sie jetzt mit SQL nerven oder langweilen zu wollen, wie auch immer Sie das sehen, nehmen wir mal das einfachste und zwar "select*from contact". "select*from contact" führt im Endeffekt einfach nur dazu, dass wir aus der Tabelle "contact" alle Daten bekommen, die es gibt. Jetzt ist eigentlich alles so weit fertig, und jetzt können wir auf dem Command-Objekt die sogenannte Execute-Methoden aufrufen, da gibt es 3 Stück: "reader", "scalar" und "execute non query". Wir nehmen hier mal den "ExecuteReader", weil wir eben Daten abfragen und nachher diese Daten auch lesen möchten. Dieser "ExecuteReader"-Aufruf liefert unseren SQL-DataReader-Objekt zurück. Davon erstellen wir uns mal eine Referenz. In diesem SQL-DataReader sind jetzt unsere Ergebnisse drin, bzw. mehr oder weniger immer nur die erste Zeile unserer Ergebnisliste. Wir müssen jetzt mit diesem DataReader durch jede einzelne Zeile unserer Ergebnisliste durchgehen. Wir sagen hier jetzt mal "while" und dann "reader.read". Mit "read" schiebe ich diesen Zeiger in der Ergebnisliste immer um ein Element weiter. Beim ersten Mal befindet sich dieser Zeiger vor der ersten Zeile. Das heißt, wenn ich jetzt "read" einmal aufrufe, wird der Zeiger auf die erste Zeile der Ergebnisliste gesetzt. Dieser Read-Aufruf gibt immer einen boolean zurück, der angibt, ob noch ein Datensatz da ist, oder nicht. Das heißt, wenn ich das hier in meiner While-Schleife benutze, dann wird jetzt die While-Schleife sooft durchgeführt, wie Datensätze in diesem Reader drin sind. Jetzt bauen wir uns mal unsere Daten zusammen, die wir uns jetzt aus unserer Ergebnisliste heraus holen. Das ist relativ einfach, wir können jetzt hier unseren Reader nehmen und dann mit einem Indexer - ähnlich wie bei einem Array - nur hier geben wir jetzt keine Nummer an - das könnten wir auch, also hier könnten wir den Index der Spalte angeben - wir geben direkt den Namen an. Das ist "first name" um jetzt z.B. den Vornamen zu holen, oder "reader last name" um den Nachnamen zu holen, oder "reader" und dann "web". Damit haben wir jetzt bei jeder Zeile, die wir durchlaufen mit dieser While-Schleife, bauen wir uns diesen Data-String zusammen, der besteht eben aus den Inhalten dieser jeweiligen Zeile, also "first name", "last name" und "web". Schlussendlich gehen wir dann hin und sagen, "Console.WriteLine" und dann "data". Hier unten schreiben wir noch eben einen "Console.ReadKey", damit die Console sich nicht einfach wieder schließt. Dann schauen wir uns das Ganze einmal an und setzen zunächst hier oben einen Breakpoint. Hier oben erstellen wir wie gesagt das Connection-Objekt, dieses Connection-Objekt ist dazu da, um eine Verbindung zur Datenbank aufzubauen. Das Ganze ist im  Using-Statement eingepackt, damit nachher diese Verbindung wieder geschlossen wird, wenn dieser Block hier unten verlassen wird. Hier öffnen wir die Verbindung, und danach erstellen wir uns ein Command-Objekt. In einem Command-Objekt können wir mehr oder weniger ein SQL-Statement kapseln, das machen wir an dieser Stelle; wir sagen "select*from contact", also hole mir aus der Tabelle "contact" alle Daten raus, die da sind. Danach füllen wir dieses Query aus und das, was wir zurückbekommen ist ein sogenannter SQL-DataReader, und in diesem Reader ist jetzt eine Ergebnisliste enthalten und die gehen wir in einer While-Schleife durch, wir sagen hier oben "while reader.read"; "read" gibt jedes mal "true" zurück, wenn noch eine Zahl vorhanden ist. An dieser Stelle bauen wir das dann zusammen, hier sehen wir Reader und dann bauen wir uns aus dem "first name", dem "last name" und dem "web" unsere Daten zusammen. Wenn ich jetzt hier auf den Data-String gehe, sieht man, er hat meinen Vornamen, meinen Nachnamen und meine Internet-Adresse. Gibt er hier aus, und hier oben hat er ja noch einen Datensatz, und das ist dann der Golo. Dann guckt er hier oben, ist noch ein Datensatz da? Nein, es ist keiner mehr da, und dann springt er raus. So kann ich das mit den ADO.NET-Klassen lösen.  Wir haben in diesem Video gesehen, wie wir Daten aus einer Datenbank mit Hilfe der ADO.NET-Datenklassen auslesen können. Wir brauchen zunächst ein SQL-Connection-Objekt, damit bauen wir eine Verbindung zur Datenbank auf; danach haben wir ein SQL-Command-Objekt, dort kapseln wir unser SQL-Statement, was wir an die Datenbank senden möchten. Und dann führen wir auf diesem SQL-Statement die ExecuteReader-Methode aus. Aus diesem ExecuteReader kommt ein SQL-DataReader heraus. Dieser SQL-DataReader enthält jetzt unsere Ergebnisliste. Und in einer While-Schleife gehen wir dann dieses Reader-Objekt durch und jedesmal, wenn wir die Methode "read" aufrufen, springt dieser interne Zeiger zur nächsten Zeile, und dann können wir mithilfe des sogenannten Indexers und durch Angabe des Spaltennamens auf den Wert von der aktuellen Zeile zugreifen und der jeweiligen Spalte. Das Ganze sieht relativ kompliziert aus; es gibt, das kann man direkt sagen, in ".NET" einfachere Varianten, um mit Datenbanken umzugehen. Das ist zum Einen das "ADO.NET Entity Framework", und "LINQ to SQL". Allerdings ist da das Problem - das kann ich Ihnen direkt schon mal von vorneherein sagen - diese beiden Technologien können wir in Visual Studio Express leider nur mit Daten-Dateien einsetzen, also mit Datenbanken, die in Dateien gespeichert werden und nicht mit unserem SQL-Server, wie wir es hier gemacht haben. Deshalb ist das die einzige Möglichkeit, in Visual Studio Express mit richtigen Datenbanken zu arbeiten.

Visual C# 2011 Grundkurs

Steigen Sie in die C#-Programmierung ein und lernen Sie sowohl die Grundlagen der Sprache C# als auch die Entwicklungsumgebung Visual Studio 2010 und .NET-Framework kennen.

7 Std. 28 min (81 Videos)
Derzeit sind keine Feedbacks vorhanden...
 
Hersteller:
Software:
Visual Studio Visual Studio 2010
Exklusiv für Abo-Kunden
Erscheinungsdatum:27.06.2011

Dieser Online-Kurs ist als Download und als Streaming-Video verfügbar. Die gute Nachricht: Sie müssen sich nicht entscheiden - sobald Sie das Training erwerben, erhalten Sie Zugang zu beiden Optionen!

Der Download ermöglicht Ihnen die Offline-Nutzung des Trainings und bietet die Vorteile einer benutzerfreundlichen Abspielumgebung. Wenn Sie an verschiedenen Computern arbeiten, oder nicht den ganzen Kurs auf einmal herunterladen möchten, loggen Sie sich auf dieser Seite ein, um alle Videos des Trainings als Streaming-Video anzusehen.

Wir hoffen, dass Sie viel Freude und Erfolg mit diesem Video-Training haben werden. Falls Sie irgendwelche Fragen haben, zögern Sie nicht uns zu kontaktieren!