【问题标题】:C# SQL Select Query table parameterC# SQL 选择查询表参数
【发布时间】:2016-04-22 08:55:53
【问题描述】:

我正在尝试从一个表中进行选择,其中表名是从一个变量中分配的,因为我使用两个不同的表。然而,它出现了一个 DB2Exception 错误。

db2Error = {"ERROR [42601] [IBM][AS] SQL0104N  An unexpected token \"'TABLENAME'\" was found following \"\". 

此查询是导致错误的查询 - 表名是一个包含表名的字符串。

string strUpdate = "SELECT COMMENT FROM '" + tableName + "' WHERE NUMBER = '" + strNumber + "' AND CODE = '" + c.Trim() + "' ";

这个查询工作正常 -

 //  string strUpdate = "SELECT COMMENT FROM TABLE WHERE NUMBER = '" + strNumber + "' AND CODE = '" + c.Trim() + "'";

是否可以为表名参数化/使用变量?

【问题讨论】:

  • 检测到SQL注入的高风险!
  • 你调试过你的代码并检查了'tablename'的值吗?向我们展示分配给 strUpdate 的 sql 查询字符串。你的表名是Table???
  • 是的,我知道我的 SQL 注入漏洞,但需要先解决这个问题。是的,调试时表名在表名中是正确的
  • 为什么你的表名有引号?除了 SQL 注入风险,我认为这是你的问题。
  • @dotctor 查询应该使用参数,可以,但不能用于表名;这会将字符串视为字符串数据并以与现在相同的方式用引号转义。无论如何,那是用户输入的可能性很低。它很可能是用于几个结构相似的表的共享函数。

标签: c# sql db2


【解决方案1】:

抛开 SQL 注入风险,显示的两个查询根本不一样

您显示的查询是

string strUpdate = "SELECT COMMENT FROM TABLE WHERE NUMBER = "

但是,您显示的代码会产生以下查询:

string strUpdate = "SELECT COMMENT FROM 'TABLE' WHERE NUMBER = "

表名不应该用引号引起来。鉴于您没有使用参数,这甚至不是参数系统的错;引号就在您自己的查询构造代码中。删除它们即可。

【讨论】:

  • 嗨,我已经从两边删除了 ' ' 引号,它工作正常。我还考虑了所有 SQL 注入 cmets,因此也感谢您。
【解决方案2】:

为什么在 from 语句中使用 qoutes?它应该只是

select sysdate 
from dual;

还可以使用 SqlCommand 类在您的选择语句中添加参数,如下所示。

string strUpdate = "SELECT COMMENT FROM @tablename WHERE NUMBER = @strnumber AND CODE = @c";
SqlCommand insertCommand = new SqlCommand(strUpdate , connection);
insertCommand.Parameters.AddWithValue("@tableName ", tableName );
insertCommand.Parameters.AddWithValue("@strNumber ", strNumber );
insertCommand.Parameters.AddWithValue("@c", c.trim());

【讨论】:

猜你喜欢
  • 2021-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-24
相关资源
最近更新 更多