FROM子句中的参数化SQL

时间:2012-05-17 15:43:56

标签: sql parameterized-query

使用OleDbCommand。我可以添加SQL参数,从而保证查询不受SQL注入的影响,但有没有办法在FROM cluase中执行此操作。请参阅下面的

这项工作

query = "Select * From Company Where @param = 1";
OleDbCommand Command = new OleDbCommand(query, sqlConnStr);

DataTable Table = new DataTable();
DataSet dataSet = new DataSet();
Table = null;

//Add Parameters
Command.Parameters.AddWithValue("param", "ID");
Command.ExecuteNonQuery();
adapter.SelectCommand = Command;
adapter.Fill(dataSet);
Table = dataSet.Tables[0];

它返回一个漂亮的表,其中包含精彩的行,其中id = 1

BUT

我正在寻找类似的东西,请注意FROM CLAUSE

query = "Select * From @tableName Where @param = 1";
OleDbCommand Command = new OleDbCommand(query, sqlConnStr);

DataTable Table = new DataTable();
DataSet dataSet = new DataSet();
Table = null;

//Add Parameters
Command.Parameters.AddWithValue("param", "ID");
Command.Parameters.AddWithValue("tableName", "Company");
Command.ExecuteNonQuery();
adapter.SelectCommand = Command;
adapter.Fill(dataSet);
Table = dataSet.Tables[0];

DBMS继续使用"Error in From clause"

返回

PS一切拼写正确 - 我三重检查


致全部 - 谢谢,但是我将坚持只参与参数化SQL。我不喜欢Dynamic SQL One BIT

3 个答案:

答案 0 :(得分:2)

你必须执行一个动态连接的SQL字符串,遗憾的是它会损害参数化SQL为你提供的任何好处。请参阅this post

DECLARE @SQL varchar(250)
SELECT @SQL = 'Select * From ' + @TableName + ' Where ' + @param + ' = 1'
Exec(@SQL)

不建议,如果您可以通过其他方式预先确定表名。

答案 1 :(得分:1)

SQL不支持参数化FROM子句。你无法按照自己的方式去做。也许你可以这样做:

query = "Select * From" + tableName + "Where @param = 1";

答案 2 :(得分:1)

您不能使用参数化的对象名称。你必须做像

这样的事情
string.format("SELECT * FROM [{0}] WHERE [{1}] = 1", tableName, columnName);

按自己的意图行事

在输入中检查方括号是值得的,这是我目前可以考虑“注入”上述示例的唯一方法。我不是黑客,而且不熟悉sql注入。像这样的可能工作:

        if (tableName.Contains("]"))
        {
            throw new ArgumentException();
        }