2010-07-25 6 views
5

Gibt es eine Möglichkeit, das zu tun? Das funktioniert nicht:C# SqlCommand - Parameter für Spaltennamen können nicht verwendet werden.

SqlCommand command = new SqlCommand("SELECT @slot FROM Users WHERE [email protected]; "); 
prikaz.Parameters.AddWithValue("name", name); 
prikaz.Parameters.AddWithValue("slot", slot); 

Das einzige, was mir einfällt, ist, SP zu verwenden und die Variable für die Spalte zu deklarieren und festzulegen. Scheint mir etwas zurückhaltend.

+0

Bedenken Sie, dass Ihre 'Benutzer' Tabelle denormalized wird, daher der Lösung für Ihr Problem würde das Auflösen des Designs in die fünfte Normalform beinhalten. – onedaywhen

Antwort

4

Sie können dies in regulärem SQL nicht tun - wenn Sie konfigurierbare Spaltennamen (oder Tabellennamen) haben müssen, müssen Sie dynamisches SQL verwenden - es gibt keine andere Möglichkeit, dies zu erreichen.

string sqlCommandStatement = 
    string.Format("SELECT {0} FROM dbo.Users WHERE [email protected]", "slot"); 

und dann mit dem gespeicherten sp_executesql proc in SQL-Server, die SQL-Befehl auszuführen (und die anderen Parameter angeben, wie erforderlich).

Dynamic SQL hat seine Vor- und Nachteile - Lesen Sie den ultimativen Artikel auf The Curse and Blessings of Dynamic SQL fachkundig von SQL Server MVP Erland Sommarskog geschrieben.

+1

Der oben angegebene Beispielcode zeigt kein dynamisches SQL, sondern nur die Verwendung der string.Format-Funktion. Wie geschrieben, ist es verwirrend. – Yellowfog

+0

@Yellowfog: jetzt diese Zeichenfolge nehmen, die und es formatiert ist in einem Anruf verwenden, um „sp_executesql“ und Sie haben Ihre dynamische SQL ..... –

+0

Na, haben Sie Ihre SQL, aber es ist nicht besonders ‚dynamisch‘, ist mein Punkt. So wie ich das verstehe, bezieht es sich auf SQL, das auf der Datenbankseite der Dinge konstruiert ist, nicht auf der Seite des Webservers. Oder bin ich ungewöhnlich, wenn ich den Begriff so nenne? – Yellowfog

7

Wie bereits erwähnt, können Sie die grundlegende Abfrage nicht parametrisieren, daher müssen Sie die Abfrage selbst zur Laufzeit erstellen. Sie sollten weiß-Liste die Eingabe dieser, Injection-Angriffe zu verhindern, aber im Grunde:

// TODO: verify that "slot" is an approved/expected value 
SqlCommand command = new SqlCommand("SELECT [" + slot + 
      "] FROM Users WHERE [email protected]; ") 
prikaz.Parameters.AddWithValue("name", name); 

Auf diese Weise @name noch usw. parametriert

Verwandte Themen