7

我有一个过滤器对象来查询一个包含许多列的表,而不是像这样编写一个覆盖所有列的条件(允许可选过滤):

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 注入。

请注意,此代码位于 Web 服务后面。

4

3 回答 3

23

只需确保最终用户不能直接提供列名,并且在手动构建查询时应该是安全的。如果您需要找出哪些列名在运行时有效,您可以使用以下查询:

SELECT column_name
FROM information_schema.columns
WHERE table_schema='public' AND table_name='yourtablename'
于 2011-04-07T17:19:01.297 回答
1

我认为最简单的解决方案是动态构建 SQL 语句。

如果您对用户提供的数据使用参数,则无法进行 SQL 注入。

于 2011-04-07T17:23:21.080 回答
0

例子:

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();
            }
        }
于 2013-10-21T11:03:31.600 回答