Как уже говорили здесь, проблема в том, что вы не можете передавать имена полей в качестве параметров.
Подход, который вы выбираете, является плохой идеей по нескольким причинам, во-первых, когда вы передаете команду sql в этомТо, как сервер должен перекомпилировать его каждый раз, когда вы выполняете этот запрос, это увеличивает нагрузку на сервер и снижает производительность.Во-вторых, это риск для безопасности, передавая ваши операторы выбора подобным образом, поскольку это дает любому, кто его перехватывает, взгляд на структуру вашей таблицы.В-третьих, использование операторов select, подобных этому, означает, что если вы когда-нибудь захотите повторно использовать код, который вы не можете использовать без вставки копии.
Я бы порекомендовал перейти на хранимую процедуру.вы все равно можете передать свои параметры и т. д., но это улучшит ваш код, поскольку он убирает SQL из c # и оставляет только то, что имеет отношение.
Если вам ДЕЙСТВИТЕЛЬНО нужно передать имена полей, которые будут использоваться в selectВ таком выражении вы можете сделать это в SQL и создать строку запроса, а затем выполнить ее с помощью sp_executesql.
По сути, вы объявляете строку запроса как
DECLARE @queryString VARCHAR(3000)
SET @queryString ='SELECT id, '+@FROM+' AS from, '+@TO+' AS to FROM Dictionary WHERE +'@FROM+' LIKE %'+@SEARCHSTRING+'%'
, а затем просто используете sp_executesqlдля выполнения @ queryString
Вам может потребоваться привести параметры как Varchar, однако, если вы получите какие-либо ошибки при создании строки запроса