Unsere Datenschutzrichtlinie wird in Kürze aktualisiert. Bitte sehen Sie sich die Vorschau an.

Datenzugriff mit ADO.NET und .NET Core

Abfragen per SqlCommand durchführen

Testen Sie unsere 2015 Kurse

10 Tage kostenlos!

Jetzt testen Alle Abonnements anzeigen
Mit diesem Video lernen Sie die komplexeren Methoden der SqlCommand-Klasse kennen, die einzelne Werte oder einen Forward-Cursor zurückgeben, die aber auch ganze Batches auf dem Server ausführen können.
10:38

Transkript

So, das Ausführen mittels "ExecuteNonQuery()" war nur eine von vielen Möglichkeiten. Genauer gesagt, gibt es vier Stück, die ich da nennen möchte, und zwar einmal "ExecuteNonQuery()", hier die zweite Zeile, die entsprechend etwas ausführt, aber keine Daten zurück erwartet. "ExecuteScalar()" in der ersten Zeile möchte eine Abfrage ausführen, liefert genau eine einzelne Information zurück. Dann gibt es "ExecuteReader()" in zwei verschiedenen Varianten. Einmal ExecuteReader so wie es da steht und ExecuteXmlReader() wie in der letzten Zeile. Und das bedeutet, dass ich dann wirklich einen "Forwardonly"-Cursor habe. Entweder einmal ganz normal mit meinem ExecuteReader() oder in Art und Weise, dass ich mit XML-Daten umgehen kann. Das zeige ich Ihnen auch gleich. Darüberhinaus gibt es noch Möglichkeiten, Batches auszuführen und Options zu setzen. Gerade beim ExecuteReader() kann ich festlegen, was er denn genau tun soll an der Stelle. "Batches" bedeutet eigentlich nichts anderes als dass ein CommandText beliebig viele Statements beinhalten kann. Das funktioniert zwar auch bei "NonQuery", ist aber hier in dem Sinne ein bisschen erwähnenswert, weil ich natürlich mehr als nur eine Ergebnismenge bekommen kann und die natürlich entsprechend dann auch durchlaufen. Das heißt, ich habe da die Möglichkeit, wirklich innerhalb eines Zugriffs auf den Server, mehrere Ergebnismengen zurückzubekommen. Und mit Options habe ich die Möglichkeit, ein bisschen Performance Tuning zu treiben, wobei da entsprechend die Unterschiede wahrscheinlich eher im Kommabereich sind an der Stelle. Ich zeige Ihnen aber mal, wie das entsprechend alles aussehen kann. Für die weiteren Demos möchte ich die Konfiguration ein kleines bisschen erweitern. Ich gehe hier in die "appsettings.json" - Datei und füge hier einen neuen ConnectionString ein. Der geht auf die gleichen Server, allerdings auf die Master-Datenbank. SPEICHERN und um einfacher darauf zugreifen zu können, gehe ich hin und baue mir dafür auch hier eine Eigenschaft und füge die da ein. Und das sieht dann so aus. Obacht! Vorsichtig bei Groß- und Kleinschreibung, kurz noch mal prüfen, ja, so ist es richtig! Damit habe ich den MasterConnectionString, das heißt, den Connection String zur Master-Datenbank. So, und dann kann es auch schon weiter gehen. Ich habe jetzt hier mein "DemoExecuteNonQuery()". Das brauche ich nicht. Ich nehme jetzt mal die ganzen Break Points raus. Dann habe ich hier was vorbereitet. Und letztendlich ist das exakt das Gleiche, was Sie auch gerade hatten. Ja, exakt natürlich nicht, es ist eine andere Abfrage hier drin. Sie haben hier einen anderen Command Teil. Er gibt mir hier sogar noch einen Fehler, weil ich den entsprechenden Bereich noch mit "Use" einfügen muss, damit CommandType.Text funktioniert. Und hier entsprechend dann ExecuteScalar(), das heißt, da erwarte ich genau eine einzige Information und das passt entsprechend natürlich auch zu dem, was ich hier oben im Statement stehen habe, nämlich "SELECT COUNT (*) FROM [sys].[databases]" und schauen wir mal, was das mir zurückliefert. Damit wir jetzt nicht jedes Mal durch alle Durchläufe... kommentiere ich die entsprechend dann aus, lasse die laufen und gucken wir mal, was zurückkommt. Sechs Stück, wenn das mal stimmt. So, hier hätten wir schon mal zwei und unter System Databases noch mal vier, also das kann durchaus schon mal richtig sein, was hier anzeigt. Das heißt, das funktioniert. Und der Unterschied ist einfach im Kern, dass ich halt wirklich hingehe und als Execute Methode "ExecuteScalar()" verwende. Wichtig ist, ich muss die Rückgabe casten. Je nachdem, was ich denn erwarte, weil die reine Rückgabe an sich, ist erst eimmal nur ein Objekt. Und wenn ich aber weiß, ich bekomme einen Integer, ich bekomme einen String, ich bekomme ein DateTime oder Ähnliches, dann muss ich das auch in der Tat wirklich angeben an der Stelle. So, und jetzt wo ich weiß, dass ich sechs Datenbanken habe, möchte ich natürlich auch wissen, wie diese heißen. Ich habe da wieder etwas vorbereitet. Dieses Mal "DemoExecuteReader()". Ich mache ein SELECT Statement auf alle Datenbanken, die ich habe. Ich gebe da die Spalten [name] und [database_id] zurück. Und Sie sehen hier bis zu dieser Stelle hier Zeile 77 ist alles soweit gleich. Danach kommt allerdings ein neues Objekt ins Spiel, nämlich der "DataReader", das heißt dieser "Forwardonly"-Cursor, mit dem ich durch die Daten durchlaufen kann. Und den bekomme ich, indem ich die "ExecuteReader()" Methode aufrufe. Mit der ich überigens auch, wenn ich möchte, weitere Spezifikationen im CommandBehavior angeben kann. Das mache ich aber erst mal zu, das spielt hier jetzt keine so große Rolle. Und dann habe ich eine While-Schleife, eine kopfgesteuerte While-Schleife, die quasi hier so lange durchläuft, bis es keine weiteren Informtionen gibt. Und das ist die schnellste Art die Daten zu lesen. Allerdings natürlich mit dem Nachteil, dass ich die hier nur in Variablen packen kann. Also ich habe keine weiterführende Struktur, wo ich die Daten unterbringen kann. Ich kann das mal nehmen und entprechend hier in den Aufrufteil bringen. So, das ist jetzt nicht so hübsch. Ein bisschen Ästhetik muss sein, so. Lasse das mal laufen und er sollte mir jetzt 6 Zeilen anzeigen. Jeweils den Namen plus der internen ID dieser Datenbank. Das scheint funktioniert zu haben. So, als nächstes zeige ich Ihnen, wie Sie eine Batch-Abfrage durchführen können, das heißt, eine Abfrage mit mehreren Statements. Hier oben sind diese mehreren Statements. Es sind zwei SELECT Statements, die nacheinander ausgeführt werden. Und der Reader, den ich entsprechend verwende, sieht bis zur ExecuteReader Methode gleich aus. Dann kann ich, wenn ich möchte, das hatte ich gerade schon gesagt, entsprechend hier Optionen angeben. Zum Beispiel SequentialAccess, was bedeutet, dass die einzelnen Informationen nur von links nach rechts gelesen werden dürfen. Ich kann also in einer Zeile nicht von weiter rechts zurück nach links springen. Das funktioniert nicht, das optimiert allerdings den Zugriff und das Versenden der Daten über das Netzwerk vom SQL-Server. So, der Teil, der hier drin ist, sieht jetzt ein bisschen wilder aus. Allerdings nur, weil ich das ein bisschen visualisieren möchte an der Stelle. Ich habe hier zwei Schleifen. Einmal hier die fußgesteuerte Do-Schleife, oder Do-While-Schleife genauer gesagt. Und hier die kopfgesteuerte While-Schleife, die wir gerade schon hatten. Der Punkt ist, wenn ich ExecuteReader aufrufe, habe ich per Definition immer eine Ergebnismenge. Es kann nur sein, dass ich eine zweite, dritte, vierte,fünfte bekomme. Insofern ist die erste Schleife fußgesteuert. Und was ich hier mache, ich gehe einfach hin und baue mir einen Header zusammen, indem ich hingehe über den DataReader, über so Methoden wie "GetName" und "GetFieldType" entsprechend die Information abzurufen, wie die Spalte heißt und wie deren Datentyp ist. Ich gebe das Ganze in der Konsole aus und dann fange ich an, die einzelnen Zeilen mit der While-Schleife mit dr.Read durchzulaufen, wie es auch gerade der Fall war. Dann gehe ich hin, durchlaufe alle sichtbaren Felder, gucke ob die entsprechend Null sind oder ob sie nicht Null sind, und gebe den entsprechenden Wert oder einfach das Literal Null aus. Und hier unten in der Entsprechung, das ist ja "Do-While" der fußgesteuerten Schleife, gebe ich mit "NextResult", gucke ich, ob ich noch eine Ergebnismenge habe. Und wenn ich das laufen lasse, dann werden Sie auch sehen, dass mit einem Zugriff nicht nur eine Ergebnismenge, sondern in dem Fall zwei geliefert wurden. Ich lasse das mal laufen. Und das sieht jetzt nicht besonders hübsch aus, aber sehen Sie hier oben die Namen der Spalten, den Datentyp, der dahinter steht, genauso auch den, den das .Net Framework dafür verwendet. Dann entsprechend die Inhalte, die Zeilen durch und dann hier das Ergebnis der zweiten Abfrage. Das könnten beliebig viele sein. So ist es ohne Weiteres im Sinne des SQL-Servers, dass er Batch-Abfragen durchführen kann. Und das ist bis zu einem gewissen Grad natürlich auch effizient, weil Sie nur einen Zugriff auf einen Server haben, um beliebig viele Daten zu bekommen. Sie haben allerdings den Nachteil, dass das Ergebnis, was Sie zurück bekommen, es gibt keinen wirklichen Namen oder Bezeichnung für eine Ergebnismenge. Es ist also schlicht die Reihenfolge. Wenn ich also hinginge, und die Statements in ihrer Reihenfolge ändern würde, das heißt, zuerst beziehungsweise als zweites dieses Statement und als erstes dieses Statement verwenden würde, dann würde das auch gleichzeitig bedeuten, dass bei der Ausführung die Ergebnismengen einfach in umgekehrter Reihenfolge kommen. Das heißt, wenn ich irgendetwas Sinnreiches damit tun möchte, muss ich natürlich sicherstellen, dass ich weiß, wann an welcher Stelle welche Ergebnismenge kommt. Und die letzte Methode, um Daten abzufragen, sind solche im XML-Format. Da habe ich natürlich etwas vorbereitet. Und ich habe also die Möglichkeit, wenn ich entweder wirklich XML-Daten schon habe oder schlicht durch ein FOR XML vom SQL-Server mir XML-Daten geben lasse, zum Beispiel hier ist das der Fall, FOR XML AUTO speziell, dann kann ich hier einen XmlReader verwenden, um die Daten zu durchlaufen. Und den muss ich auch erst einfügen. Den Namensraum kann das dann aufrufen. Und ich bekomme im Wesentlichen natürlich jetzt wieder die Datenbank mit ihren IDs zurückgespielt. Kann das aber als XML ausgeben. Ich mache das mal. Benutzt man relativ selten, aber kann ja durchaus mal vorkommen, dass Sie damit konfrontiert werden. So, das lasse ich mal laufen. Sie sehen, das Ergebnis sieht schon so ein bisschen XML-mäßig aus. Ich gehe jetzt hier nicht weiter auf die Details dann ein oder was man hier möglicherweise noch variieren könnte, aber Sie kriegen hier einen XmlReader, Sie können auch dahin gehen und sagen, hey, ich wähle die Zeile, möchte dann entsprechend durchlaufen und zeige dann das Ergenis an. Und das Ergebnis sieht schlicht und ergreifend dann so aus, wie Sie es hier haben, die einzelnen Elemente sogar noch mit den öffnenden und schließenden Klammern, wie Sie sie vom XML so her kennen halt.

Datenzugriff mit ADO.NET und .NET Core

Lernen Sie, wie mit Ihrer .NET Core-Anwendung auf relationale Datenbanken wie z.B. SQL Server oder SQLite zugreifen.

2 Std. 49 min (28 Videos)
Derzeit sind keine Feedbacks vorhanden...
 
Software:
Exklusiv für Abo-Kunden
Erscheinungsdatum:12.04.2017

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!