【发布时间】:2018-02-12 18:40:27
【问题描述】:
我使用 odp.net 将 EntityFramework 与 Oracle 一起使用。参数化的sql查询不起作用。
var orderCode = "XYZ";
var set = ctx.Database.SqlQuery<Order>(
"Select * from dwh.Orders where OrderCode = '{0}'"
, orderCode
);
(或)
var set1 = ctx.Database.SqlQuery<Order>(
"Select * from dwh.Orders where OrderCode = ':param'",
new OracleParameter("param", orderCode)
);
Console.WriteLine(set.Count() + ", " + set1.Count()); //Gives 0, 0
但是,如果我对值进行硬编码,它就可以工作。
var set = ctx.Database.SqlQuery<Order>(
"Select * from dwh.Orders where OrderCode = 'XYZ'",
orderCode
);
有人知道为什么吗?我在那个视图中有 150 列。有问题吗?
更新: 使用 Oracle 参数的查询有效。问题是我在 :param 变量周围有单引号。
话虽如此,带有“{0}”的顶级查询不起作用。此外,以下 linq 查询不起作用。
var set = ctx.Orders.Where(a => a.OrderCode == orderCode); // Gets zero results.
当我对值进行硬编码时,它可以正常工作并正确获取结果。
var set = ctx.Orders.Where(a => a.OrderCode == "XYZ"); // Gets the results correctly.
更新 2: 这些查询与 Devart 的 dotconnect 驱动程序一起使用。看起来这是 odp.net 的问题。
有人有类似的问题吗?
【问题讨论】:
-
你能更好地解释“不起作用”吗?您是否收到异常、空结果或错误结果?
-
使用
a.OrderCode.Equals(orderCode)是否有效 -
.Equals 也不起作用。
-
我遇到了类似的问题。我不想在我的应用程序中引用 ODP 驱动程序(这就是我有 EF 的原因),所以这很烦人。现在,我可能会做连接 SQL 的反模式。该参数完全在应用程序内部,因此 SQL 注入不会成为问题。尽管如此,它在我的嘴里留下了不好的味道。
-
任何带有完整源代码示例的最终解决方案?
标签: linq entity-framework odp.net