【问题标题】:Run query with table name parameter使用表名参数运行查询
【发布时间】:2012-06-07 07:02:23
【问题描述】:
Dim tbl as String = Request.QueryString("tb") 'tb value = User
Dim sql As String = "Select * From @table Where @Col = @ColVal"
Dim para As New SqlParameter
para.ParameterName = "table"
para.Value = tbl

Dim paraArray1 As New SqlParameter
paraArray1.ParameterName = "@Col"
paraArray1.Value = "Name"

Dim paraArray2 As New SqlParameter
paraArray2.ParameterName = "@ColVal"
paraArray2.Value = "Stephen"

当我尝试使用 DbDataAdapter 运行“sql”命令时,它给了我这个错误

必须声明表变量“@table”。说明:未处理 执行当前 Web 请求期间发生异常。 请查看堆栈跟踪以获取有关错误的更多信息和 它起源于代码的地方。

异常详细信息:System.Data.SqlClient.SqlException:必须声明 表变量“@table”。

请建议我应该怎么做才能以给定的表名作为参数运行 sql 并避免 sql 注入。非常感谢!

【问题讨论】:

    标签: asp.net vb.net


    【解决方案1】:

    参数与存储过程有关,不能在内联查询中指定。您需要连接查询中的参数。

    为避免 SQL 注入,最好的方法是使用存储过程,但如果您需要使用内联查询,请在进行内联查询之前检查值。

    【讨论】:

      【解决方案2】:

      参数只对值有效。更改 SQL 字符串:

      Dim sql As String = String.Format("Select * From {0} Where {1} = @ColVal",tableName,ColName)
      

      【讨论】:

      • 我明白了,谢谢。但是这样是不是也避免了sql注入呢?
      • @user1439709 - 这是真的,但这里没有其他选择(你想生成动态 sql 文本)。
      【解决方案3】:

      正确写入表的参数名称..

      para.ParameterName = "@table"
      

      使用SqlParameter 以某种方式避免Sql Injection,因为参数永远不会直接插入到语句中.....

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-12
        • 1970-01-01
        • 2019-07-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多