使用双引号和参数添加到查询

时间:2016-11-25 16:36:57

标签: c# postgresql npgsql

我可以在PgAdminIII中运行正面的原始查询:

SELECT * FROM oestrat."Themenfeld"

oestrat Themenfeld 是来自Winform文本框的字符串。

所以我在VS中的查询是:

string qry = "SELECT * FROM @schema.\"@line\"";

NpgsqlCommand cmd = conn.CreateCommand();
cmd.Parameters.Add(new NpgsqlParameter("@schema", tbSchema.Text)); // tbSchema.Text = oestrat
cmd.Parameters.Add(new NpgsqlParameter("@line", l)); // string l = Themenfeld

cmd.CommandText = qry;

conn.Open();
NpgsqlDataReader dr = cmd.ExecuteReader();

while (dr.Read()) <<< ERROR
{
     ....
}

它始终捕获异常:

42601: syntax error at or near "@"

2 个答案:

答案 0 :(得分:3)

我不相信您可以将表名指定为参数...只能将 values 指定为参数。

相反,要么在表名中包含允许的表名的白名单,要么至少包含允许的字符的白名单,将其应用于您的用户输入,然后 - 仔细 - 构建SQL动态。

答案 1 :(得分:0)

将模式和表名解析为字符串...

string qry = $"SELECT * FROM {tbSchema.Text}.{l}";

显然,您将为SQL注入清理这些输入值...