2013-06-13 14 views
8

odp.netを使用してOracleでEntityFrameworkを使用しています。パラメータ化されたSQLクエリは機能しません。Entity Frameworkでodp.netを使用して、linqクエリでパラメータを取らない

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. 

UPDATE 2: クエリはDevartからキ繝ァ繝ヨドライバで動作します。これはodp.netの問題であるように見えます。

誰でも同様の問題がありますか?あなたはあなたの例を切り捨てていますが、複数のパラメータを使用している場合、これは問題になる可能性がある場合

+0

"うまくいかない"と説明できますか?あなたは例外、空の結果、または間違った結果を得ていますか? –

+0

'a.OrderCode.Equals(orderCode) 'を使用すると動作しますか –

+0

.Equalsも機能しません。 – Jonna

答えて

1

わからない:

Parameterized query in Oracle trouble

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

0

Oracleとの接続の文字列を使用している場合、それは(詳細はCHAR versus VARCHAR2 Semanticsを読む)CHARのように定義されているパッドの文字列への癖を持っているよう注意してください。

あなたはXYZその後、PL/SQLのブランク・パッド(_は、パディング文字がここにあるのに対し)XYZ_になり宣言された長さの値の値でCHAR(4)としてOrderCodeを定義していると仮定します。

比較してどちらかの値がデータ型VARCHAR2、 非ブランク埋め込みセマンティクスを持っている場合:

非定数文字列orderCodeが原因docsでこのステートメントにVARCHAR2として扱われることを前提としてい使用されています。つまり、等しくない長さの文字値を と比較すると、PL/SQLは調整を行わず、 は正確な長さを使用します。

は今、あなたはa.OrderCode == orderCodeをしようとするならば、左側がCHARあり、右側がVARCHAR2であるためnon-blank-paddingXYZ_ = XYZfalseを返し、その結果が使用されます。

だから、解決策は.TrimEnd()VARCHAR2を返すPL/SQL RTRIM()機能に変換されて比較作業を行うことがa.OrderCode.TrimEnd() == orderCodeのようなものを使用することです。

関連する問題