我想提供查询的表名作为命令参数,如下所示:
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'"这将导致错误(注意单引号)。
"SELECT * from E'mytable'"
我真的需要为此进行字符串连接吗?从安全的角度来看这没关系,因为用户无法更改表名,但是用于创建SQL查询的字符串连接总是让我感到毛骨悚然…
谢谢,埃里克
表名不能作为参数发送。表名称在解析时解析,因为计划和此类操作需要它们。仅在执行程序(或优化程序,必要时)时替换参数。
是的,您将需要使用字符串替换。当然,只要表名来自您的类中的const,就不是安全问题(甚至不是成为一个安全问题)。
但是,如果您确实要根据用户输入来构造表名,则需要非常小心。但是通常,如果您需要根据用户输入来构造表名,那么数据库中的某些内容首先会被设计不良,并且应该予以修复(是的,当然还有例外)。