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

Datenzugriff mit ADO.NET und .NET Core

Parameter bei Abfragen richtig verwenden

Testen Sie unsere 2021 Kurse

10 Tage kostenlos!

Jetzt testen Alle Abonnements anzeigen
Erfahren Sie hier, wie Abfrageparameter mit der Klasse SqlParameter richtig eingesetzt werden und wie mittels der Prepare()-Methode die Performance gesteigert werden kann.
07:54

Transkript

Der nächste wichtige Punkt bei Abfragen ist, dass diese häufig Parameter beinhalten. Da sollten Sie nicht den Kardinalsfehler machen und versuchen, diesen Inhalt, also diesen Parameterwert in den String mit aufzunehmen. Das ist definitiv nicht Sinn und Zweck der Sache. Das ist zum einen sehr fehlerbehaftet und zum anderen auch für einen SQL-Server relativ inperformant. Der soll durchaus schon wissen, dass der eine oder andere Wert schlicht ein Parameter ist. Nachteil ist natürlich, ich kann Parameter nicht überall definieren. Ich kann zum Beispiel, wenn ich ein SELECT Statement als Beispiel nehme, nicht den Namen der Tabelle oder der Sicht auf die das SELECT Statement geht, als Parameter verwenden. Das geht nicht, aber ich kann zum Beispiel hinten in den Prädikaten kann ich ohne Weiteres sagen, ja, pass auf, filter mir das mit der Spalte soundso, Wert soundso als Parameter, und das wiederum kann ich dann zur Laufzeit definieren. Dafür existiert auch entsprechend ein Objekt, nämlich das DbParameter Objekt, für den Sequel Server ist das ein SQL Parameter. Und damit kann ich dann dem SqlCommand Objekt mitgeben, wie die Werte aussehen sollen, die ich entweder als Platzhalter im Abfragetext definiert habe oder die als Parameter für Prozeduren oder Ähnliches existieren und kann dann entsprechend hingehen, vor der Ausführung die Werte, wie gesagt, definieren, dann ausführen und bin dann auf jeden Fall auf der sicheren Seite, was zum Beispiel das Formatieren komplexer Datentypen wie so was wie Datum/Uhrzeit und Ähnliches betrifft. So, und damit sind wir wieder im Visual Studio. Das kann ich zuklappen, das brauchen wir jetzt erst mal nicht. Ein Beispiel, wie die Übergabe von Parametern aussehen kann und auch aussehen sollte, sieht wie folgt aus: Ich habe hier eine Testmethode, der übergebe ich ein DateTime, genauer gesagt, ein nullable DateTime. Und hier in dem SELECT Statement benutze ich diesen Wert an dieser Stelle. Wohl gemerkt allerdings hat der Name des Parameters nichts zu tun mit dem Namen des Parameters der Funktionen. Das sind zwei völlig unterschiedliche Dinge. Und macht natürlich schon Sinn, den Namen in beiden Fällen halt zumindest ähnlich zu halten an der Stelle. So, das heißt, ich habe hier diesen Platzhalter und kann dann hingehen und hier unten vor der Ausführung letztendlich, aber ja, nachdem ich im Wesentlichen den CommandType und CommanText definiert habe, entsprechend die Werte dann zuweisen. Das mache ich dann, indem ich zum Beispiel prüfe, ob mein Nullable einen Wert hat. Wenn es einen Wert hat, dann übergebe ich den auch. Das ist dann diese Zeile hier. cmd.Parameters.AddWithValue und wenn es keinen Wert hat, muss ich speziell DBNull.Value übergeben an der Stelle. Also nicht wirklich Null übergeben. Das hat nämlich dann den Effekt, dass Sie eine Fehlermeldung bekommen, die dann besagt, dass der Parameter keinen Wert hat. Was in dem Sinne natürlich schon richtig wäre, aber es ist nicht das, was Sie erreichen möchten. Der Rest ist exakt das Gleiche wie vorher. Es geht also nur darum, dass ich dem oder den Parametern entsprechend Werte zuweise. Es sei angemerkt, dass dieser Platzhalter, wenn ich möchte, narürlich auch mehrfach auftauchen kann in meinen Abfragen. Das heißt, ich muss dann nicht mehrfach mit unterschiedlichen Platzhaltern arbeiten, auch wenn der gleiche Inhalt da ist. Ich kann das einfach dann create_date nennen und auch an anderer Stelle verwenden. So, dann gehe ich hin und fülle das hier aus. Das kann ich jetzt mit zwei Sachen ausfüllen. Ich könnte zum einen schlicht Null übergeben, das ist der eine Punkt und ich kann zum anderen hingehen und sagen, ich möchte es auch ein zweites Mal ausrufen und sagen, DateTime sagen wir mal Today.AddDays mal gucken, was ab gestern angelegt wurde. So, die beiden Aufrufe habe ich. Ich mache jeweils dann hier einen Break, lasse das mal laufen und der erste Aufruf war jetzt ohne Wert für diese Variabel. Sie sehen hier ist Null. Man geht hier in den unteren Fall rein und führt das aus. Das Ergebnis sieht dann so aus. Und ich lasse das ein zweites Mal laufen und das Ergebnis sieht dann so aus an der Stelle. Das heißt, wenn Sie Werte übergeben Platzhalter hier oben verrwenden, ein @-Zeichen davor, das ist die Convention, das muss so sein. Und hier unten können Sie auf das @-Zeichen dann verzichten, wenn Sie einen wirklichen Null-Wert übergeben möchten, im Sinne der Datenbank, dann bitte DBNull.Value verwenden. Eine andere interessante Möglichkeit, gerade wenn Sie Schleifen durchlaufen, ist es, schlicht und ergreifend die Statements vorzubereiten. Das heißt, Sie sagen dem SQL-Server im Wesentlichen, pass auf, das Statement, was jetzt entsprechend ausgeführt wird, wird mehrfach kommen, die einzige Variable, oder der einzige Variabel-Teil sind entsprechend die Parameter. Das kann ich machen, indem ich Folgendes verwende im ADO.NET: Ich kann mit sogenannten Prepared Commands arbeiten. Das bedeutet, ich muss bei der Angabe der Parameter sehr genau sein. Nicht so wie gerade, wo ich eigentlich den Datentyp gar nicht angegeben habe. Das überlasse ich dann dem SQL-Server. Ich kann aber hier zum Beispiel, oder ich muss sogar hier genau angeben, wie weit zum Beispiel ein Datentyp ist. Also, dass ich hier einen VarChar 100 habe, dass muss ich hier präzise angeben an der Stelle. Ich muss sogar beim Integer auch sagen, ok pass auf, dieser Integer ist 4 Bytes breit, 32 Bit an der Stelle. Dafür kann ich aber hier unten dann sagen, wenn ich möchte, cmd.Prepare() und damit wird das Statement vorbereitet. Es wird ein Aufruf auf den Server durchgeführt, ich bekomme ein Handle zurück oder es wird ein Handle zurückgeliefert und wenn ich dann in der Schleife später das Statement ausführe, dann wird einfach immer nur noch dieser Handle angegeben. Das bedeutet, je umfangreicher die Abfrage hier oben ist, desto mehr Netzwerkverkehr spare ich auch. und das kann sich bei entsprechend großer Zeilenanzahl durchaus lohnen an der Stelle. Ich gehe mal hin und rufe die auch auf. Das heißt, das wird auch noch einmal auskommentiert Dann kann ich das bzw. die Verwendung der Prepare Methode hier über einen Parameter steuern. Ich gebe hier mal True ein und gehe einfach mal hin und reduziere hier die Anzahl. So, speichere das, lass das laufen. Und Sie sehen, es dauert schon einen kleinen Moment an der Stelle. So richtig der optimalste Ansatz ist das so oder so nicht. Mal gucken, ob sich was getan hat. Ja, es sieht so aus, als wenn es mehr Zeilen geworden wären. Und eigentlich müßte er jetzt mittlerweile auch schon durch sein. wo hängt er denn? Ja doch, er ist wirklich durch. Und hat dann die Zeilen entsprechend eingefügt bzw. diese Statements aufgerufen genauer gesagt. Das heißt, merken Sie sich, wenn Sie Schleifen haben mit einer möglicherweise relativ großen Anzahl an Durchläufen, und Sie genau wissen, wie die Parameter auszusehen haben, was man in der Regel ja weiß, dann haben Sie die Möglichkeit, entsprechend das Statement einmal vorzubereiten. Wie gesagt, Sie kriegen Handle, unter der Haube wird ein Handle verwendet für alle fortlaufenden Aufrufe. Und hier haben Sie dann entsprechend die Möglichkeit, innerhalb der Schleife nur noch die Parameterwerte zu ändern, dann den nächsten Aufruf durchzuführen und sind damit dann relativ schnell unterwegs 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!