Имя таблицы и поле таблицы на SqlParameter С#?

Я хотел бы знать, как передать имя таблицы и имя поля таблицы через SqlCommand на С#.

Попытка сделать это так, как это сделала, установив SqlCommand с символом @, но не сработав. Любые идеи?

Ответы

Ответ 1

Если вас беспокоит SQL-инъекция, SqlCommandBuilder класс (и другие конкретные версии DB DbCommandBuilder) имеют функцию QuoteIdentifier, которая будет правильно удаляться из вашего имени таблицы.

var builder = new SqlCommandBuilder();
string escTableName = builder.QuoteIdentifier(tableName);

Теперь вы можете использовать экранированное значение при создании своего оператора и не беспокоиться об инъекции, но вы все равно должны использовать параметры для любых значений.

Ответ 2

Я думаю, вы пытаетесь выполнить оператор sql, например

select @field from @table

но это не сработает. Sql не может иметь параметры по именам полей или именам таблиц, только по значениям.

Если моя догадка неверна, пожалуйста, уточните свой вопрос.

Ответ 3

Параметры SqlCommand могут использоваться только для передачи данных. Вы не можете использовать их для изменения инструкции sql (например, добавление дополнительных полей в оператор select). Если вам нужно изменить оператор sql, я бы предложил использовать StringBuilder для создания инструкции tsql.

Чтобы подробнее остановиться,.NET не объединяет sql перед отправкой его на SqlServer (по крайней мере, не так прямо, как вы могли бы ожидать). Он фактически вызывает хранимую процедуру и передает аргументы отдельно. Это позволяет Sql Server кэшировать план запроса и оптимизировать производительность вашего tsql.

Если вы должны были написать этот SqlCommand...

var cmd = new SqlCommand("SELECT * FROM MyTable WHERE MyID = @MyID", conn);
cmd.Parameters.AddWithValue("@MyID", 1);
cmd.ExecuteNonQuery();

Это tsql, который выдается на сервер Sql...

exec sp_executesql N'SELECT * FROM MyTable WHERE MyID = @MyID',N'@MyID int',@MyID=1

Подробнее о sp_executesql в MSDN.