2010-07-25 10 views
5

Czy jest jakiś sposób, jak to zrobić? To nie działa:C# SqlCommand - nie można użyć parametrów dla nazw kolumn, jak rozwiązać?

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

Jedyne co mogę myśleć to użycie SP i zadeklarować i ustawić zmienną dla kolumny. Wydaje mi się nieco przecząca.

+0

Rozważmy, że 'stół Users' jest nieznormalizowane, stąd rozwiązanie twojego problemu wymagałoby rozwiązania projektu do piątej normalnej formy. – onedaywhen

Odpowiedz

4

Nie można tego zrobić w regularnych SQL - jeśli trzeba mieć konfigurowalne nazwy kolumn (lub nazwę tabeli, dla tej sprawy), należy użyć dynamicznego SQL - nie ma innego sposobu, aby to osiągnąć.

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

a następnie użyć sp_executesql proc przechowywanej w SQL Server do wykonania tego polecenia SQL (i określić inne parametry w zależności od potrzeb).

Dynamiczny SQL ma swoje zalety i wady - przeczytaj ostateczny artykuł na temat The Curse and Blessings of Dynamic SQL fachowo napisany przez SQL Server MVP Erland Sommarskog.

+1

Przykładowy kod dajesz powyżej nie wykazuje dynamiczny SQL, to po prostu pokazuje wykorzystanie funkcji string.Format. Jak napisano, jest to mylące. – Yellowfog

+0

@Yellowfog: teraz wziąć ten ciąg, który został sformatowany i używać go w rozmowie z „sp_executesql” i masz swój dynamiczny SQL ..... –

+0

Cóż, masz SQL, ale nie jest szczególnie „dynamiczne”, jest mój punkt. Jak rozumiem, odnosi się do SQL, który jest zbudowany na stronie bazy danych, a nie stronie serwera WWW. Czy jestem niezwykły w przyjmowaniu tego terminu? – Yellowfog

7

Jak już wspomniano, nie można parametryzacji fundamentalną zapytanie, więc trzeba będzie zbudować kwerendę siebie na starcie. Należy biało-lista wejście tego, aby zapobiec atakom wtrysku, ale fundamentalnie:

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

ten sposób @name nadal parametryzowane itp

Powiązane problemy