3

パラメータを使用してテーブルから選択している動的SQL選択を実行しようとしています。

SELECT null FROM @TableName 

ただし、エラーが発生しますmust declare table variable @TableName。これは、変数を使用してテーブルから選択しているためだと思います。私はこれまでこれを行う必要はありませんでした。

List<SqlParameter> sqlParams = new List<SqlParameter>()
{ 
    new SqlParameter("TableName", "testtable"),
    new SqlParameter("FieldName", "testfield"),
    new SqlParameter("Find", "testfind"),
};
string sqlSelect = "SELECT null FROM @TableName 
                    WHERE @FieldName LIKE '%' + @Find + '%' ";

DataTable dtSelect = SqlHelper.ExecuteDataset(sqlConn, CommandType.Text, 
                        sqlSelect, 30, sqlParams.ToArray()).Tables[0]; 
//30 = timeout

動的SQLを使用して上記を実行するにはどうすればよいですか?(ストアドプロシージャは使用しないでください)

4

3 に答える 3

5

テーブル名や列名などのパラメーターは使用できません。それらの場合、可能な値のホワイトリストを作成し、SQLクエリを作成するときに文字列連結を使用できます。

于 2011-09-27T06:56:34.013 に答える
4

そのようなパラメーターは使用できないため、クエリを文字列として作成する必要があります。これは SQL で行うこともできますが、C# コードで文字列を作成することもできます。

テーブル名とフィールド名が安全で信頼できる値であり、Web 要求などの安全でないソースから直接取得されていないことを確認してください。

string tableName = "testtable";
string fieldName = "testfield";

List<SqlParameter> sqlParams = new List<SqlParameter>() { 
  new SqlParameter("Find", "testfind"),
};
string sqlSelect =
  "SELECT null " +
  "FROM " + tableName + " " +
  "WHERE " + fieldName + " LIKE '%' + @Find + '%' ";
于 2011-09-27T07:06:48.470 に答える
1
    private DataTable ExecuteDynamic(string TableName,string FieldName, string Find)
    {

    string sqlSelect = "SELECT * FROM " + TableName +  
                        " WHERE " + FieldName + " LIKE '%'" + Find + "'%' ";
    using (connection = new SqlConnection(Strcon))
        connection.Open();
    {
        using (cmd = new SqlCommand(sqlSelect, connection))
        {
            cmd.CommandType = CommandType.Text;
            cmd.CommandTimeout = 60;
            adpt = new SqlDataAdapter(cmd);
            dt = new DataTable();
            adpt.Fill(dt);
            return (dt);
        }
    }
}
于 2011-09-27T07:09:30.873 に答える