簡體   English   中英

FROM子句中的參數化SQL

[英]Parameterized SQL in FROM clause

使用OleDbCommand 我可以添加SQL參數,從而使查詢免受SQL注入的影響,但是有一種方法可以在FROM聚類中做到這一點。

這項工作

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 One BIT

您必須執行一個動態串聯的SQL字符串,不幸的是,這將損害參數化SQL給您提供的任何好處。 看到這篇文章

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

如果您可以通過其他方式預先確定表名,則不建議這樣做。

SQL不支持對FROM子句進行參數化。 您無法按照嘗試的方式進行操作。 可能您可以這樣做:

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

您不能使用參數化的對象名稱。 你將不得不做這樣的事情

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

自行承擔責任

可能值得檢查輸入中的方括號,這是我目前可以考慮“注入”以上示例的唯一方法。 我不是黑客,也不精通sql注入。 這樣的事情可能會起作用:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM