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

时间:2013-03-19 20:04:14

标签: 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();

运行此功能不会返回任何结果。如果我用

之类的东西替换参数
"SELECT * FROM web_project_task_vw WHERE project_num like '%"+term+"%'"

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

任何人都可以指出我的参数在EF 4中对Oracle DB的工作方式是正确的吗?

感谢。

2 个答案:

答案 0 :(得分: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();

答案 1 :(得分:1)

您的p可能包含不正确的参数名称;名称应为param1,而不是@param1。您的查询也不正确;将'%@param1%'替换为'%:param1%'