SQL表参数

时间:2009-12-12 13:23:07

标签: c# sql sql-server sql-injection

为什么SQL Server中不允许使用表参数?这有什么解决方案吗?

示例:

using (SqlCommand myCommand = new SqlCommand("SELECT * FROM @table WHERE USERNAME=@username AND PASSWORD=HASHBYTES('SHA1',
 @password)", myConnection))
    {
        myCommand.Parameters.AddWithValue("@table", table);
        myCommand.Parameters.AddWithValue("@username", user);
        myCommand.Parameters.AddWithValue("@password", pass);

        myConnection.Open();
        SqlDataReader myReader = myCommand.ExecuteReader())
        ...................
    }

感谢。

5 个答案:

答案 0 :(得分:3)

你无法对这部分SQL进行参数化。服务器需要知道能够“准备”查询的表的名称,这是在处理参数之前完成的。

您可以动态生成查询,但这可能会导致SQL注入攻击和运行时SQL语法错误。此外,如果服务器可以缓存SQL语句,则可以节省成本 - 如果每个查询都是动态生成的,那么你将会失去它。

答案 1 :(得分:1)

如果你必须传递价值表......

否则,你想做什么?

编辑:我现在知道了。正如其他人所提到的,SQL并不像那样工作。

答案 2 :(得分:1)

为什么呢?因为与查看优化和验证时产生的噩梦相比,灵活性的好处很小。

作为旁注,即使已经识别出您将在SQL中获取带引号的字符串,而不仅仅是表名。具有大量验证的动态SQL是实现此目的的唯一真正方法。

答案 3 :(得分:0)

,您无法将表名作为参数传递。

最好的方法是尝试使用String.Format作为表名。

答案 4 :(得分:0)

我会尝试通过一个例子来说明我的观点:

如果你去买车,你可以“参数化”一些人认为:你可以改变颜色,可能是发动机的一些变化,你可以放MP3或不...,但你不能改变车模型。如果你改变汽车模型,这不是一个参数,这是另一辆汽车。

与sql查询相同,表不是一个参数是句子本身的一部分,同样的命令是(select,update)..所以你不能从@table做@command。如果你改变了表格,那就是另一句话,就像汽车一样。

(这不是技术性的“因为”问题的答案,而是一个概念上的观点,以便更好地理解其他人发布的技术部分)

我的两分钱。