8

odp.netを使用してOracleでEntityFrameworkを使用しています。パラメータ化された 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 の問題のようです。

誰もが同様の問題を抱えていますか?

4

2 に答える 2

1

例を切り捨てたかどうかはわかりませんが、複数のパラメーターを使用している場合、これが問題になる可能性があります。

Oracle トラブルでのパラメータ化されたクエリ

あなたの例には何も問題はありませんが、古い BindByName 問題に見舞われているのではないでしょうか。デフォルトでは、ODP.NETは、必要に応じて名前に基づくのではなく、コレクションに追加された順序でパラメータをクエリにバインドします。OracleCommand オブジェクトで BindByName を true に設定してみて、問題が解決するかどうかを確認してください。

于 2013-06-14T01:05:47.713 に答える