使用双引号和参数添加到查询
Work with double quotes and parameter adding to a query
我可以在 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 "@"
我不相信您可以将 table 名称指定为参数...只能将 值 指定为参数。
相反,要么有一个允许 table 名称的白名单,要么至少有一个允许 table 名称中的 个字符 的白名单,将其应用于您的用户输入,然后 - 小心地 - 动态构建 SQL。
只需将架构和 table 名称解析为字符串...
string qry = $"SELECT * FROM {tbSchema.Text}.{l}";
显然您已经为 SQL 注入清理了这些输入值...
我可以在 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 "@"
我不相信您可以将 table 名称指定为参数...只能将 值 指定为参数。
相反,要么有一个允许 table 名称的白名单,要么至少有一个允许 table 名称中的 个字符 的白名单,将其应用于您的用户输入,然后 - 小心地 - 动态构建 SQL。
只需将架构和 table 名称解析为字符串...
string qry = $"SELECT * FROM {tbSchema.Text}.{l}";
显然您已经为 SQL 注入清理了这些输入值...