在Entity Framework中参数化原始Oracle SQL查询

use*_*143 9 c# oracle entity-framework-4

我正在尝试在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();
Run Code Online (Sandbox Code Playgroud)

运行此操作不会返回任何结果.如果我用类似的东西替换参数

"SELECT * FROM web_project_task_vw WHERE project_num like '%"+term+"%'"
Run Code Online (Sandbox Code Playgroud)

它返回我期望的结果,但这显然是SQL注入风险.

任何人都可以指出我的参数应该如何在EF 4中为Oracle DB工作的正确方向?

谢谢.

小智 8

首先,就像Mohammed写的那样,你需要在参数前加上':',但不要像你定义的那样,只在查询中.其次,您当前搜索的不是参数的值,而是搜索包含字符串的字符串@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();
Run Code Online (Sandbox Code Playgroud)


Moh*_*ain 2

您的p参数名称可能不正确;名字应该是param1,不是@param1。您的查询也不正确;'%@param1%'用。。。来代替'%:param1%'