2010-07-25 16 views
5

Esiste un modo per farlo? Questo non funziona:C# SqlCommand - non è possibile utilizzare i parametri per i nomi delle colonne, come risolvere?

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

L'unica cosa che mi viene in mente è quello di utilizzare SP e dichiarare e impostare la variabile per la colonna. Mi sembra un po 'imbarazzante.

+0

Si consideri che il '' degli utenti tavolo è denormalizzato, da cui il la soluzione al tuo problema implicherebbe la risoluzione del progetto in quinta forma normale. – onedaywhen

risposta

4

Non è possibile eseguire questa operazione in SQL standard: se è necessario disporre di nomi di colonne configurabili (o nome tabella, per quella materia), è necessario utilizzare SQL dinamico: non esiste altro modo per ottenere ciò.

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

e quindi usare il sp_executesql stored procedure in SQL Server per eseguire il comando SQL (e specificare gli altri parametri in base alle esigenze).

Dynamic SQL ha i suoi pro e contro - leggere l'ultimo articolo su The Curse and Blessings of Dynamic SQL scritto da esperti di SQL Server MVP Erland Sommarskog.

+1

Il codice di esempio fornito sopra non dimostra SQL dinamico, mostra solo l'uso della funzione string.Format. Come scritto è confuso. – Yellowfog

+0

@Yellowfog: ora prendi questa stringa che è stata formattata e usala in una chiamata a "sp_executesql" e hai il tuo SQL dinamico ..... –

+0

Bene, hai il tuo SQL, ma non è particolarmente 'dinamico', è il mio punto. A quanto ho capito, si riferisce a SQL che è costruito sul lato del database delle cose, non sul lato del server web. O sono insolito nel prendere il termine in questo modo? – Yellowfog

7

Come è stato menzionato, non è possibile parametrizzare la query fondamentale, quindi sarà necessario creare la query stessa in fase di esecuzione. Si dovrebbe white-list l'ingresso di questo, per prevenire attacchi di iniezione, ma fondamentalmente:

// 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); 

questo modo @name è ancora parametrizzata ecc

Problemi correlati