小编典典

如何在Npgsql中提供查询的表名作为命令参数?

sql

我想提供查询的表名作为命令参数,如下所示:

public class Foo
{
    private const String myTableName = "mytable";

    public void Bar()
    {
        NpgsqlCommand command = new NpgsqlCommand("SELECT * from :tableName", connection);
        command.Parameters.Add(new NpgsqlParameter("tableName", DbType.String));
        command.Parameters[0].Value = myTableName;
    }
}

这似乎导致了该查询:"SELECT * from E'mytable'"这将导致错误(注意单引号)。

我真的需要为此进行字符串连接吗?从安全的角度来看这没关系,因为用户无法更改表名,但是用于创建SQL查询的字符串连接总是让我感到毛骨悚然…

谢谢,埃里克


阅读 179

收藏
2021-04-28

共1个答案

小编典典

表名不能作为参数发送。表名称在解析时解析,因为计划和此类操作需要它们。仅在执行程序(或优化程序,必要时)时替换参数。

是的,您将需要使用字符串替换。当然,只要表名来自您的类中的const,就不是安全问题(甚至不是成为一个安全问题)。

但是,如果您确实要根据用户输入来构造表名,则需要非常小心。但是通常,如果您需要根据用户输入来构造表名,那么数据库中的某些内容首先会被设计不良,并且应该予以修复(是的,当然还有例外)。

2021-04-28