使用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
答案 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();
}