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.

Datenzugriff mit ADO.NET und .NET Core

Hochgeschwindigkeitsimport von Daten

LinkedIn Learning kostenlos und unverbindlich testen!

Jetzt testen Alle Abonnements anzeigen
Die SqlBulkCopy-Klasse eröffnet die schnellste Art des Datenimports. Weil in ADO.NET Core weder die aus ADO.NET Classic bekannten IDataReader noch DataTables enthalten sind, wird es auch bei dieser Zugriffsart etwas komplizierter.
06:57

Transkript

Gerade hatte ich gesagt, dass der Import via BulkCopy oder SqlBulkCopy die schnellste Art ist, Daten auf den Server zu bekommen. Ich zeige Ihnen jetzt im folgenden Abschnitt, wie das genau funktioniert. Auch da gibt es wieder einige Einschränkungen bei ADO.NET Core war bei der Klassikversion noch möglich, als Datenquelle einen DbDataReader, aber auch ein IDataReader-Objekt, also ein Objekt, das genau diese Schnittstelle implementiert, und natürlich ein DataTable zu übergeben. Letzteren beiden funktionieren einfach nicht mehr, weil die einfach nicht mehr unterstützt werden an der Stelle. Letztlich ist es mit BulkCopy eine recht einfache Sache. Ich erzeuge so ein Objekt, ich gebe ihm die nötigen Informationen, wo die Daten hin sollen, und rufe dann WriteToServer auf, und WriteToServer übergebe ich dann die Datenquelle. Ich zeige Ihnen, wie das in Action aussieht. Das ist nicht so kompliziert, wie es klingt. So, wir sind wieder im Visual Studio. Was ich gemacht habe, ich habe hier eine Klasse direkt übernommen aus dem Demoprojekt. Die werde ich auch gleich insoweit erklären, die ist einfach nötig, damit der BulkCopy funktioniert. Dann nehme ich den Code, den wir dafür brauchen. Wir brauchen dafür den hier nicht mehr. Gehen ans Ende, klappen das auch ein. Etwas Ordnung muss sein. Und Überraschung, das reimt sich sogar. Ich habe also hier ein Demo. Wie geht der Ablauf generell? Ich erzeuge ein SqlBulkCopy-Objekt mit dem entsprechenden ConnectionString. Dann lege ich fest, in welche Tabelle ich die Daten importieren möchte, ob ich ein Streaming erlauben würde, was im Prinzip gut für die Performance ist. Ich kann eine BatchSize festlegen. Das heißt, er versucht immer 100000 Zeilen auf einmal zu importieren. Das Ganze wird auch in kleinere Stückchen gehackt. Und ich kann sagen NotifyAfter. Das bekommt in dem Fall alle 100000 Zeilen ein Event ausgelöst. Das Event kann ich hier an die SqlRowsCopied-Eigenschaft koppeln. Das ist hier unten diese kleine Feedbackfunktion quasi. Das heißt, ich bekomme durch dieses Event mit, dass regelmäßig so und so viele Zeilen importiert sind, wenn ich sowas wie einen Fortschrittbalken oder Ähnliches darstellen möchte. Dann muss ich meinen DbDataReader instanziieren. Das kann natürlich jetzt durchaus eine etwas komplexere Sache sein, wenn Sie wirklich einen Real-Life-Einsatz dafür haben. Das heißt, woher kommt die Daten, lese ich die aus einer Datei oder ähnlichen Sachen? Wenn ich das gemacht habe, kann ich einfach sagen WriteToServer und übergebe diesen DataReader. Dann gehe ich da mal rein. Sie sehen, das ist eine etwas umfangreichere Klasse. Witzigerweise brauche ich in dem Beispiel den größten Teil nicht mal. Sie sehen, von 61 geht es auf 215. Das bedeutet, die Klasse, die ich hier für die Ableitung habe, hat Tonnen an abstrakten Methoden und Eigenschaften, die ich alle implementieren muss. Überall, wo abstract steht, die müssen implementiert sein. Ich brauche letztlich nur eine relativ überschaubare Zahl in dem Fall. Zum Beispiel muss ich Auskunft darüber geben, wie viele Spalten ich habe. Es sind zwei. Dann muss ich feststellen oder zurückgeben können, ob ich die nächste Zeile habe, also ob ich quasi das Ende erreicht habe, das ist diese Read-Methode. Dann muss ich Auskunft darüber geben, ob eine Spalte NULL-Werte hat oder nicht. Dann muss ich entsprechend den Wert auch zurückliefern für eine bestimmte Spalte. Hier kriege ich ordinal, das ist die Reihenfolge der Spalten. Und kann dann, je nachdem ob ich mich in der ersten mit Index 0 oder in der zweiten mit Index 1 befinde, entweder numerischen Wert oder Text zurückgeben an der Stelle. Das war es schon. Das ist Minimalbesetzung. Die restlichen Funktionen, die ich hier habe, sind teilweise auch für andere Zwecke, die benutzt nicht der SqlBulkCopy, aber es könnte zum Beispiel sein, dass Sie eine Implementierung haben, die dann sowas wie RecordsAffected zurückliefern muss, oder die einzelne Byte-Information zurückliefert, also wenn Sie wirklich Blobs oder Ähnliches haben, die Sie da verwenden. Das heißt, da kann es durchaus um einiges komplizierter sein. Aber um rein Datei zurückzuliefern, im Sinne von ich habe meine Zahl und ich habe einen String und vielleicht noch einen anderen Basistyp, reicht das völlig aus. Gehen wir zurück in das Hauptprogramm wieder. Dann rufe ich das Ganze auf. Gehe jetzt rüber in das SQL Server Management Studio. Während das läuft, oder startet, starte ich hier schon mein Programm. Verbinde mich dann mit der SQL-Serverinstanz. Ist aber schon fertig, wie Sie sehen. Das ging relativ fix. Die kann ich auch wegräumen, die brauchen wir nicht. Dann können wir schauen, wie viele Zeilen wir jetzt in dieser Tabelle haben. Sind fünf Millionen. Und um kurz einen Vergleich zu haben, das geht extrem schnell, nochmal neu starten. Es sollten dann eine Million mehr sein. Denn es geht mit dem Feedback relativ schnell. Und tatsächlich habe ich jetzt eine Million Zeilen mehr. Das heißt, das funktioniert wirklich extrem schnell und die Daten werden also mit einer Datenpumpe wirklich auf den Server gepumpt, und sind ruckzuck dort entsprechend verfügbar. Nochmal kurz zurück in den Code. Der Programmaufwand letztlich, oder der Aufwand der Programmierung ist relativ überschaubar. Ich denke, das kann man hier fast vernachlässigen. Da ist nicht besonders viel Magie drin. Das hängt natürlich etwas damit zusammen, was ich wirklich als Feedback zurückgeben möchte, wie das auszusehen hat. Denke, der größte Aufwand liegt in dieser DataReader-Klasse. Selbst das hält sich möglicherweise in Grenzen. Also wenn Sie zum Beispiel Daten aus einer CSV-Datei oder Ähnliches lesen wollen, dann ist das relativ fix gemacht an der Stelle.

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!