2012-06-07 70 views
0
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注入。非常感谢!表正确的

回答

0

写参数名称..

para.ParameterName = "@table" 

使用SqlParameter避免以某种方式SQL注入的参数是不能直接插入语句.....

+0

我试过这个,但它仍然不起作用。 –

0

参数仅供值是有效的。更改SQL字符串:

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

我明白了,谢谢。但是,这样做是否也避免了sql注入? –

+1

@ user1439709 - 这是真的,但这里没有其他选择(您想生成动态的sql文本)。 – adatapost

2

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

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