2

を使用し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 すべてのスペルが正しい - 私は三重にチェックした


すべての皆様へ - ありがとうございます。Dynamic SQLOne BITは好きじゃない

4

3 に答える 3

2

動的に連結されたSQL文字列を実行する必要があります。これは、残念ながら、パラメータ化されたSQLが最初に提供した利点をすべて損なうことになります。この投稿を参照してください。

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

代わりに他の方法でテーブル名を事前に決定できる場合は、お勧めできません。

于 2012-05-17T15:55:08.763 に答える
1

SQL は FROM 句のパラメーター化をサポートしていません。あなたがしようとしている方法でそれを行うことはできません。おそらく、次のようにすることができます。

query = "Select * From" + tableName + "Where @param = 1";
于 2012-05-17T15:59:31.753 に答える
1

パラメータ化されたオブジェクト名は使用できません。あなたは次のようなことをしなければならないでしょう

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

あなた自身の危険でそうしてください

入力に角かっこがあるかどうかを確認する価値があるかもしれません。これが、上記の例を「挿入」するために現在考えることができる唯一の方法です。私はハッカーではありませんが、SQL インジェクションに精通していません。このようなものがうまくいくかもしれません

        if (tableName.Contains("]"))
        {
            throw new ArgumentException();
        }
于 2012-05-17T16:01:42.083 に答える