我可以在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 "@"
答案 0 :(得分:3)
我不相信您可以将表名指定为参数...只能将 values 指定为参数。
相反,要么在表名中包含允许的表名的白名单,要么至少包含允许的字符的白名单,将其应用于您的用户输入,然后 - 仔细 - 构建SQL动态。
答案 1 :(得分:0)
将模式和表名解析为字符串...
string qry = $"SELECT * FROM {tbSchema.Text}.{l}";
显然,您将为SQL注入清理这些输入值...