#c# #sql #postgresql #npgsql
#c# #sql #postgresql #npgsql
Вопрос:
Я передаю параметры в sql-запросе, используя драйвер npgsql:
SqlCommand = new NpgsqlCommand();
....
SqlCommand.CommandText = "SELECT id,name FROM table1 WHERE field1=:param2 ORDER BY name;";
SqlCommand.Parameters.AddWithValue("param2", 1);
Этот запрос выполнен правильно и выдал необходимые данные, но как только я добавлю параметр в sql в разделе «выбрать»
SqlCommand.CommandText = "SELECT id,name :param1 FROM table1 WHERE field1=:param2 ORDER BY name;";
SqlCommand.Parameters.AddWithValue("param1", ",field1");
SqlCommand.Parameters.AddWithValue("param2", 1);
это дает мне какую-то бессмыслицу. Теоретически этот запрос к серверу должен обрабатываться как
SELECT id,name,field1 FROM table1 WHERE field1=1 ORDER BY name;
но этого не произошло.
Возникает вопрос: есть ли способ динамической вставки списка полей с использованием подобных параметров?
Комментарии:
1. Это вообще не то, как работают параметризованные запросы в любой базе данных, которая их поддерживает (вместо того, чтобы подделывать их). Они представляют значения , а не строковые замены. Если вы введете параметр,
SELECT
вы должны вернуть значение параметра
Ответ №1:
К сожалению, Npgsql не поддерживает то, что вы пытаетесь сделать. Предполагается, что значения NpgsqlParameter должны использоваться только в качестве значений параметров в предложении where . Чтобы динамически добавлять имена полей, как вы намереваетесь, вам нужно будет создать запрос вручную, используя конкатенацию строк.
Надеюсь, это поможет.
Комментарии:
1. Каков рекомендуемый способ добавления динамических значений без риска SQL-инъекции? Например, как мне добавить динамическое значение в вызов функции, в котором нет предложения WHERE?
2. @SteveGlick используйте LINQ и ORM или microORM для генерации инструкции или будьте очень, очень, очень осторожны при построении запроса, например, генерируйте только
SELECT
инструкцию после проверки того, что предоставленные значения на самом деле являются полями таблицы.
Ответ №2:
Перепишите текст вашей команды и добавьте это:
foreach (NpgsqlParameter item in _Command.Parameters)
{
comm.Parameters.AddWithValue(item.ParameterName, item.Value);
}
И решить вашу проблему..