【问题标题】:Parameters not replacing properly in NpgsqlCommandNpgsqlCommand 中的参数没有正确替换
【发布时间】:2015-06-05 15:43:25
【问题描述】:

我正在尝试替换字符串中的参数以在 Npgsql 查询中执行。

问题是,当它用字符串中的值替换参数时,它会添加不必要的括号,因此查询会返回错误。

NAME_SCHEMA_DBNAME_ADMIN_DB 是字符串常量, ExecuteCommand 只需要一个 NpgsqlCommand 并执行它。

这是我的代码:

String qdropSchema = @"DROP SCHEMA IF EXISTS @name_schem CASCADE";
String qCreateSchema = @"CREATE SCHEMA @name_schem AUTHORIZATION @name_admin";


DbCommand commandeDrop = new NpgsqlCommand(qdropSchema);
commandDrop.Parameters.Add(new NpgsqlParameter("@name_schem", NAME_SCHEMA_DB));

DbCommand commandCreate = new NpgsqlCommand(qCreateSchema);
commandCreate.Parameters.Add(new NpgsqlParameter("@name_schem", NAME_SCHEMA_DB));
commandCreate.Parameters.Add(new NpgsqlParameter("@name_admin", NAME_ADMIN_DB));


ExecuteCommand(commandDrop);
ExecuteCommand(commandCreate);

这是它在到达 ExecuteCommand(commandDrop) 时尝试运行的 SQL 查询

如果存在则删除模式 (('test_schemaName')) 级联;

我不确定它为什么要添加额外的括号和单引号。通常,我希望它运行的查询是

如果存在则删除模式 test_schemaName CASCADE;

【问题讨论】:

  • 因为它是一个字符串,参数系统用引号括起来。参数并不真正意味着指定表或模式。架构名称是用户输入的吗?

标签: c# .net npgsql


【解决方案1】:

SQL 参数通常只对 values 有效(例如字段的值)——而不是字段名和表名等。虽然这很烦人,但您可能需要将这些名称直接嵌入到SQL。

当然,您应该非常小心地这样做 - 任何可能来自用户输入的地方,您都应该使用某种形式的白名单。

【讨论】:

  • @chardubs “当用户收到 Jon Skeet 对其问题的回答时,该用户有义务“接受”这个回答。查看规则。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-10-31
  • 2016-11-12
  • 1970-01-01
  • 2022-09-30
  • 1970-01-01
  • 1970-01-01
  • 2018-11-22
相关资源
最近更新 更多