2012-05-17 49 views
2

使用OleDbCommand。我可以添加SQL参数,从而保持该查询从SQL注入安全的,但有一种方法来FROM cluase.See内做到这一点下面FROM子句中的参数化SQL

这个作品

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

我期待这样的事情,请注意from子句

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一位

+0

根据微软的OleDbCommand甚至不支持命名Paramters http://msdn.microsoft.com/en-us/library/system.data.oledb.oledbcommand.parameters。 aspx但顶级代码摘录正常工作 –

回答

2

你不得不执行动态串联SQL字符串,不幸的是会损害任何利益参数化的SQL提供了您开始。见this post

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

不可取的,如果你可以通过一些其他手段预先表名来代替。

+0

您应该使用[QUOTENAME](http://msdn.microsoft.com/zh-cn/library/ms176114.aspx)来包装@TableName和@param。即'from'+ QUOUTENAME(@TableName)+'where'。这不仅减少了由于表/列名称为保留字或包含特殊字符而导致语法错误的机会。 – GarethD

1

SQL不支持要参数化的FROM子句。你不能按照你的方式去做。大概你可以这样做:

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

请注意[SQL INJECTION](http://bobby-tables.com/) – GarethD

+0

是的,它是可以运行的,但这仅仅是一个例子,并且显示它自己承担风险。 – Rahul

1

你不能使用paramaterised对象名称。你将不得不这样做财产以后像

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

SO请自行危险

这可能是值得一试的方括号中输入,这是我目前能想到的唯一途径“注入“上面的例子。我不是黑客,但不熟悉SQL注入。事情是这样的威力工作:

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