2

パラメータプレースホルダーを使用して列名の値をSQL引数として渡す方法は?

目標は、これを機能させることです:

var sql = "SELECT * FROM Condos WHERE @0 LIKE @1";
var sqlData = db.Query(sql,choice,"%"+searchString+"%");

choiceを格納する変数です。column name

@0ですcolumn name(そして、引数として渡すことに成功しません)

@1ですsearch string(そして、私はそれに問題はありません)

多くのことを読んで試しました:

以下はエラーをスローしませんが、データをもたらしません

var sql = "SELECT * FROM Condos WHERE @0 LIKE @1";
var sqlData = db.Query(sql,choice,"%"+searchString+"%");

1投以下Column name not valid = '@0'

var sql = "SELECT * FROM Condos WHERE [@0] LIKE @1"
var sqlData = db.Query(sql,choice,"%"+searchString+"%");

1投以下Column name not valid = 'choice'

var sql "SELECT * FROM Condos WHERE choice LIKE @0");
var sqlData = db.Query(sql,"%"+searchString+"%");

1投以下Must declare scalar variable "@choice"

var sql "SELECT * FROM Condos WHERE @choice LIKE @0");
var sqlData = db.Query(sql,"%"+searchString+"%");

以下はエラーをスローしませんが、データをもたらしません

var sql = "SELECT * FROM Condos WHERE '@choice' LIKE @0";
var sqlData = db.Query(sql,"%"+searchString+"%");

以下はエラーをスローしませんが、データをもたらしません

var sql = "SELECT * FROM Condos WHERE '@choice' LIKE @0";
var sqlData = db.Query(sql,"%"+searchString+"%");

以下はエラーをスローしませんが、データをもたらしません

var sql = "SELECT * FROM Condos WHERE '"+choice+"' LIKE @0";
var sqlData = db.Query(sql,"%"+searchString+"%");

1つ下:BIG CRASH

var sql = "SELECT * FROM Condos WHERE '"+@choice+"' LIKE @0";
var sqlData = db.Query(sql,"%"+searchString+"%");

1投以下Column name not valid = 'NameShort'

これは正確に正しい列名です

var sql = "SELECT * FROM Condos WHERE ['"+choice+"'] LIKE @0";
var sqlData = db.Query(sql,"%"+searchString+"%");

1つ下:BIG CRASH

var sql = "SELECT * FROM Condos WHERE ['"+@choice+"'] LIKE @0";
var sqlData = db.Query(sql,"%"+searchString+"%");

ヘルプ !!!!!!!!!!!!!!

4

2 に答える 2

2

簡単に言えば、できないということです。パラメータは値に対してのみサポートされ、列名に対してはサポートされません。

リチャードが言ったように、テキストの直接挿入にフォールバックする必要があります (これがコードで発生するか、SQL Server exec() 関数を使用して発生するかに関係なく)、クエリを作成できる何らかのライブラリ (LINQ など) を使用する必要があります。動的に変換し、それをテキスト表現に変換します。

直接テキストを挿入する場合は、直接ユーザー入力を挿入できないようにしてください。SQL インジェクション攻撃を回避するために、何らかの変換を自分で行ってください。

于 2012-09-22T14:35:01.447 に答える
0

私はあなたが試したことを見ていますが、あなたは明らかなものを省きました:

var sql = "SELECT * FROM Condos WHERE " + choice + " LIKE @1";
var sqlData = db.Query(sql,choice,"%"+searchString+"%");

列名をエスケープする必要がある唯一の理由は、Order. その場合、データベース固有の識別子エスケープ文字を使用する必要があります。

たとえば、MySQL:

var sql = "SELECT * FROM Condos WHERE `" + choice + "` LIKE @1";
var sqlData = db.Query(sql,choice,"%"+searchString+"%");

SQLサーバー

var sql = "SELECT * FROM Condos WHERE [" + choice + "] LIKE @1";
var sqlData = db.Query(sql,choice,"%"+searchString+"%");
于 2012-09-21T21:46:04.137 に答える