10

EF 4 で Oracle シノニム (非エンティティ) の生の SQL クエリをパラメーター化しようとしていますが、いくつか問題があります。現在、私が見たいくつかの例に基づいて、以下のコードのようなことをしています:

 string term="foo";
 OracleParameter p = new OracleParameter("@param1", term);
 object[] parameters = new object[] { p };
 var model = db.Database.SqlQuery<ProjectTask>("SELECT * FROM (SELECT * FROM web_project_task_vw WHERE project_num like '%@param1%') WHERE rownum<=100", parameters).ToList();

これを実行しても結果は返されません。パラメータを次のようなものに置き換えると

"SELECT * FROM web_project_task_vw WHERE project_num like '%"+term+"%'"

期待どおりの結果が返されますが、これは明らかに SQL インジェクションのリスクです。

パラメータがOracle DBのEF 4でどのように機能するかについて、誰かが私を正しい方向に向けることができますか?

ありがとう。

4

2 に答える 2

8

まず、モハメッドが書いたように、パラメーターの前に「:」を付ける必要がありますが、定義したとおりではなく、クエリ内だけです。次に、現在、パラメーターの値ではなく、文字列を含む文字列を検索しています@param1。したがって、パラメータの値を % で囲むと、結果が得られるはずです。

したがって、次のようになります。

string term="foo";
 OracleParameter p = new OracleParameter("param1", term);
 object[] parameters = new object[] { p };
 var model = db.Database.SqlQuery<ProjectTask>("SELECT * FROM (SELECT * FROM web_project_task_vw WHERE project_num like '%'||:param1||'%') WHERE rownum<=100", parameters).ToList();
于 2013-12-05T14:54:50.887 に答える
2

パラメータp名が間違っている可能性があります。名前はparam1ではなくである必要があり@param1ます。クエリも正しくありません。に置き換え'%@param1%'ます'%:param1%'

于 2013-03-19T20:14:19.170 に答える