C# SQL 选择查询表参数
Posted
技术标签:
【中文标题】C# SQL 选择查询表参数【英文标题】:C# SQL Select Query table parameter 【发布时间】: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 查询应该使用参数,可以,但不能用于表名;这会将字符串视为字符串数据并以与现在相同的方式用引号转义。无论如何,那是用户输入的可能性很低。它很可能是用于几个结构相似的表的共享函数。 【参考方案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());
【讨论】:
考虑到它是作为字符串参数添加的,那不会仍然在表名周围加上引号吗? blogs.msmvps.com/jcoehoorn/blog/2014/05/12/…以上是关于C# SQL 选择查询表参数的主要内容,如果未能解决你的问题,请参考以下文章
如何避免从 C# 构建的 Sql Server 2005 参数化查询变慢