Я пытаюсь реализовать API со следующей подписью:
public static List<string> SearchDatabase(
string column,
string value);
Для реализации API необходимо создать запрос SQL SELECT
с предложением WHERE
, в котором используется имя столбца, указанное в параметре column
.
Запрос:
string query =
string.Format(
"SELECT Name, @Column " +
"FROM Db1 " +
"INNER JOIN Db2 ON Db1.Id = Db2.Id " +
"WHERE @Column = @Value");
Команда и параметры SQL:
SqlCommand selectCmd =
new SqlCommand(
query,
connection);
selectCmd.CommandTimeout = SqlCommandTimeout;
selectCmd.Parameters.AddRange(
new SqlParameter[]
{
new SqlParameter("@Column", column),
new SqlParameter("@Value", value)
});
И я выполняю это так:
SqlDataReader sqlDataReader = selectCmd.ExecuteReader();
while (sqlDataReader.Read())
{
// ...
}
Проблема в том, что sqlDataReader
не возвращает никаких строк, поэтому я не захожу в цикл while
выше.
Однако, если я изменю последнюю строку запроса выше с:
"WHERE @Column = @Value");
до
"WHERE Vendor = @Value");
(т. Е. Жестко закодировать имя столбца в 'Vendor'), затем оно работает.
Насколько я понимаю из проведенного мною исследования, невозможно передать имена столбцов в качестве параметров, а только те значения, к которым мы обращаемся. Но, похоже, он позволяет мне использовать параметр @Column
в предложении SELECT
, а не предложение WHERE
.
Я не хочу прибегать к динамическому SQL из-за проблем с внедрением SQL. Есть ли другой способ обойти это?