2013-06-13 3 views
8

Ich benutze EntityFramework mit Oracle mit odp.net. Die parametrisierte SQL-Abfrage funktioniert nicht.Entity Framework mit Oracle mit odp.net nicht Parameter in linq Abfrage

var orderCode = "XYZ"; 
var set = ctx.Database.SqlQuery<Order>(
    "Select * from dwh.Orders where OrderCode = '{0}'" 
    , orderCode 
); 

(oder)

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 

Wenn ich jedoch den Wert harter Code haben, funktioniert es.

var set = ctx.Database.SqlQuery<Order>(
    "Select * from dwh.Orders where OrderCode = 'XYZ'", 
    orderCode 
); 

Weiß jemand warum? Ich habe 150 Spalten in dieser Ansicht. Ist das ein Problem?

UPDATE: Die Abfrage mit dem Oracle-Parameter funktioniert. Das Problem ist, dass ich einfache Anführungszeichen um die Variable: param hatte.

Die oben genannte Abfrage mit '{0}' funktioniert nicht. Außerdem funktioniert die folgende linq-Abfrage nicht.

Wenn ich den Wert fest codiere, funktioniert es und holt die Ergebnisse korrekt.

var set = ctx.Orders.Where(a => a.OrderCode == "XYZ"); // Gets the results correctly. 

UPDATE 2: Die Abfragen arbeiten mit dotConnect Treiber von Devart. Sieht so aus, als wäre das ein Problem mit odp.net.

Hat jemand ähnliche Probleme?

+0

Können Sie erklären "funktioniert nicht" besser? Erhalten Sie eine Ausnahme, ein leeres Ergebnis oder falsche Ergebnisse? –

+0

Funktioniert es, wenn Sie 'a.OrderCode.Equals (orderCode)' –

+0

verwenden. Equals funktioniert auch nicht. – Jonna

Antwort

1

Nicht sicher, ob Sie Ihr Beispiel abgeschnitten, aber wenn Sie mehrere Parameter verwenden, könnte dies das Problem sein:

Parameterized query in Oracle trouble

Obwohl ich nichts falsch mit Ihrem Beispiel sehen können, ich frage mich, ob du vom alten BindByName-Problem betroffen bist. Standardmäßig bindet ODP.NET Parameter an die Abfrage in der Reihenfolge, in der sie der Sammlung hinzugefügt werden, und nicht basierend auf ihrem Namen, wie Sie möchten. Versuchen Sie, BindByName für Ihr OracleCommand-Objekt auf true zu setzen, und sehen Sie, ob das Problem dadurch behoben wird.

0

Vorsicht beim Zeichenketten in Verbindung mit Oracle verwenden, da es die Marotte zu Pad Saiten hat, die als CHAR definiert ist (CHAR versus VARCHAR2 Semantics für Details lesen).

Nehmen wir an, Sie OrderCode als CHAR(4) mit einem Wert von XYZ dann PL/SQL-blank-Pads der Wert für die angegebene Länge definiert haben, die in XYZ_ führt (während _ die Füllzeichen hier).

übernehmen Sie auch, dass der nicht konstant String orderCode als VARCHAR2 behandelt wird aufgrund dieser Aussage in den docs:

Wenn entweder Wert in einem Vergleich hat Datentyp VARCHAR2, nicht-blank-padding Semantik werden verwendet. Das heißt, wenn Zeichenwerte ungleicher Länge verglichen werden, macht PL/SQL keine Anpassungen und verwendet die genauen Längen.

Nun, wenn Sie versuchen, eine a.OrderCode == orderCode dann ist die linke Seite zu tun CHAR und die rechte Seite ist VARCHAR2 und daher non-blank-padding verwendet wird, die Ergebnisse in XYZ_ = XYZfalse zurück.

So ist die Lösung so etwas wie a.OrderCode.TrimEnd() == orderCode zu verwenden, der Vergleich der Arbeit als .TrimEnd() zu machen in die SQL PL/übersetzt RTRIM() Funktion, die ein VARCHAR2 zurückgibt.

Verwandte Themen