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 选择查询表参数的主要内容,如果未能解决你的问题,请参考以下文章

SQL 意外选择

如何避免从 C# 构建的 Sql Server 2005 参数化查询变慢

解析 TSQL 选择查询并返回列表达式

从 C# 代码中使用 SQL Server CE 选择 @@ IDENTITY

C# 中的简单 SQL 选择?

在 C# 中的 SQL Server 上合并选择