【问题标题】:Parameterizing a raw Oracle SQL query in Entity Framework在实体框架中参数化原始 Oracle SQL 查询
【发布时间】:2013-03-08 17:01:12
【问题描述】:

我正在尝试为 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 工作的参数的正确方向?

谢谢。

【问题讨论】:

  • 我认为 Oracle 参数名称以 : 开头,而不是 @?

标签: c# oracle entity-framework-4


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    首先,就像 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();
    

    【讨论】:

    • 也适用于 EF6。
    猜你喜欢
    • 1970-01-01
    • 2021-03-02
    • 1970-01-01
    • 2016-05-20
    • 1970-01-01
    • 2015-06-16
    • 1970-01-01
    • 2016-06-08
    相关资源
    最近更新 更多