2013-03-19 17 views
7

EF 4でOracleシノニム(非エンティティ)の生のSQLクエリをパラメータ化しようとしていますが、いくつか問題があります。現在のところ、私が見たいくつかの例に基づいて、以下のコードのようなことをしています。Entity Frameworkで生の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でパラメータがどのように機能するのかを誰かが正しい方向に向けることができますか?

ありがとうございました。

+0

::の代わりに@

だからそれは次のようになりますか? – RogerN

答えて

1

pのパラメータ名が正しくない可能性があります。名前はparam1で、@param1ではありません。あなたの質問も間違っています。 '%@param1%''%:param1%'に置き換えてください。

6

最初に、Mohammedの書いたように、パラメータの前に ':'を付ける必要があります。 第2に、現在パラメータの値ではなく、文字列@param1を含む文字列を検索しています。そのため、パラメータの値を%で囲むと結果が得られます。私はOracleのパラメータ名は、使用を開始考え

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(); 
+0

EF6でも動作します。 –

関連する問題