Anscheinend wird mit dem folgenden Code nichts so ausgegeben, wie es erwartet wird. Ich bin mir sicher, dass es damit zu tun hat, dass ich versucht habe, eine Liste von Elementen in @namelist
zu schreiben. Natürlich ist es nicht nur ein Textersatz.
Wie kann ich dieses Problem lösen? Danke
%Vor%Leider werden SQL-Parameter nicht auf diese Weise aufgelöst , anders gesagt, das Backend erstellt nicht einfach eine sichere Zeichenfolge, die jeden Parameter durch seinen Wert ersetzt. Stattdessen müssen Sie eine Parameterliste dynamisch erstellen:
%Vor%Und fügen Sie dann jeden Parameter hinzu:
%Vor%Sie könnten diese Parameter natürlich in einer Schleife hinzufügen, wenn die Nummer bis zur Laufzeit unbekannt ist:
%Vor% Wenn Ihre Liste von Tabellen in einem enum
gespeichert wurde oder Sie sie mit einem regulären Ausdruck validieren konnten, wäre es auch ziemlich sicher, nur das rohe SQL selbst zu erstellen und überhaupt keine Parameter zu verwenden.
Dies ist natürlich einer der großen Gründe, warum ich PostgreSQL verwende; native Unterstützung für Arrays.
Wie bereits erwähnt, sind "in" -Listen usw. in ado.net notorisch peinlich; Aus diesem Grund bieten einige Tools bequeme Methoden, um zu helfen. Zum Beispiel bietet Dapper eine Variante der "in" -Syntax an, die automatisch auf die korrekte parametrisierte Form erweitert wird (wobei die Injektionssicherheit beibehalten bleibt usw.) - sowohl bei typgebundener als auch bei "dynamischer" Verwendung. Zum Beispiel:
%Vor%Dies vermeidet auch die Notwendigkeit, mit db-command / parameter / reader herumzuhantieren. Beachten Sie die Klammern "in" ohne , mit denen dieses Muster erkannt wird.
Sie verwenden Ihre Liste momentan nicht. Wenn Sie es für etwas anderes nicht brauchen, können Sie das einfach tun:
%Vor%Dies überprüft, ob es in diesen 3 Werten ist.
Tags und Links sql sql-server c#