Как динамически запрашивать имена столбцов, используя Postgres / NpgSQL - PullRequest
7 голосов
/ 07 апреля 2011

У меня есть объект фильтра для запроса таблицы со многими столбцами, а не для записи условия, охватывающего все столбцы (с возможностью дополнительной фильтрации), например:

WHERE ((:value0 IS NULL) OR (column_name0 = :value0)) AND ((:value1 IS NULL) OR (column_name1 = :value1)) AND... etc

для каждого столбца. Вместо этого в идеале я хотел бы иметь возможность передавать имя поля в качестве параметра:

WHERE :column_name0 = :value0 AND column_name1 = :value1 AND... etc

, что невозможно, поскольку столбцы требуются во время разбора (аналогично этому ответу , приведенному здесь ).

Как вы справляетесь с этим? - Я действительно не хочу поддерживать SQL при добавлении или удалении новых столбцов (как это было бы в моем первом примере), и я думаю, что это для меня было бы опасно напрямую создавать имена столбцов в командной строке, так как это могло бы позволить внедрение SQL.

Обратите внимание, что этот код находится за веб-службой.

Ответы [ 3 ]

23 голосов
/ 07 апреля 2011

Просто убедитесь, что конечные пользователи не могут предоставить имена столбцов напрямую, и вы должны быть в безопасности при создании запроса вручную.Если вам нужно выяснить, какие имена столбцов действительны во время выполнения, вы можете использовать следующий запрос:

SELECT column_name
FROM information_schema.columns
WHERE table_schema='public' AND table_name='yourtablename'
1 голос
/ 07 апреля 2011

Я думаю, что самое простое решение - создать оператор SQL на лету.

Внедрение SQL невозможно, если вы используете параметры для данных, предоставленных пользователем.

0 голосов
/ 21 октября 2013

пример:

NpgsqlCommand command = new NpgsqlCommand(SQL, Connection);
        Npgsql.NpgsqlDataReader Resource = command.ExecuteReader();

        while (this.Resource.Read())
        {
            for (int i = 0; i < this.Resource.FieldCount; i++)
            {
                string field = this.Resource.GetName(i).ToString();
            }
        }
...