Есть ли какой-либо путь, как сделать это? Это не работает:
SqlCommand command = new SqlCommand("SELECT @slot FROM Users WHERE name=@name; ");
prikaz.Parameters.AddWithValue("name", name);
prikaz.Parameters.AddWithValue("slot", slot);
Единственная вещь, о которой я могу думать, состоит в том, чтобы использовать SP и объявить и установить переменную для столбца. Кажется мне небольшим ackward.
Вы не можете сделать это в обычном SQL - если у вас должны быть настраиваемые имена столбцов (или имя таблицы, если на то пошло), вы должны использовать динамический SQL - другого способа добиться этого нет.
string sqlCommandStatement =
string.Format("SELECT {0} FROM dbo.Users WHERE name=@name", "slot");
, а затем используйте хранимую процедуру sp_executesql
в SQL Server для выполнения этой команды SQL (и при необходимости укажите другие параметры).
У динамического SQL есть свои плюсы и минусы - прочтите последнюю статью Проклятие и благословения динамического SQL , написанную специалистом по SQL Server Эрландом Соммарскогом.
Как уже упоминалось, вы не можете параметризовать основной запрос, поэтому вы нужно будет построить сам запрос во время выполнения. Вы должны занести в белый список входные данные this, чтобы предотвратить атаки инъекций, но в основном:
// TODO: verify that "slot" is an approved/expected value
SqlCommand command = new SqlCommand("SELECT [" + slot +
"] FROM Users WHERE name=@name; ")
prikaz.Parameters.AddWithValue("name", name);
Таким образом, @name
по-прежнему параметризовано и т. Д.