我试图在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的工作方式是正确的吗?
感谢。
答案 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%'
。