Entity Framework mit Oracle mit odp.net nicht Parameter in linq Abfrage

8

Ich verwende EntityFramework mit Oracle mit odp.net. Die parametrisierte SQL-Abfrage funktioniert nicht.

%Vor%

(oder)

%Vor%

Wenn ich jedoch den Wert hart Code habe, funktioniert es.

%Vor%

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 obige Abfrage mit '{0}' funktioniert nicht. Die folgende Linq-Abfrage funktioniert auch nicht.

%Vor%

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

%Vor%

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

Hat jemand ähnliche Probleme?

    
Jonna 13.06.2013, 21:17
quelle

2 Antworten

1

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

Parametrisierte Abfrage in Oracle-Problemen

  

Obwohl ich mit Ihrem Beispiel nichts falsches sehen kann, frage ich mich, ob Sie vom alten BindByName-Problem betroffen sind. 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 in Ihrem OracleCommand-Objekt auf true zu setzen, und sehen Sie, ob das Problem dadurch behoben wird.

    
Tom Halladay 14.06.2013 01:05
quelle
0

Seien Sie vorsichtig bei der Verwendung von Strings in Verbindung mit Oracle, da es die Eigenart hat, Strings aufzubrechen, die als CHAR definiert sind (lesen Sie CHAR gegen VARCHAR2 Semantik für Details).

Nehmen wir an, Sie haben OrderCode als CHAR(4) mit einem Wert von XYZ definiert, dann PL / SQL blank - puffert den Wert auf die deklarierte Länge, was in XYZ_ resultiert (während _ das Füllzeichen ist) hier).

Nehmen Sie außerdem an, dass die nicht konstante Zeichenkette orderCode aufgrund dieser Anweisung als VARCHAR2 behandelt wird. Dokumente :

  

Wenn einer der Werte in einem Vergleich den Datentyp VARCHAR2 hat,   Nicht-Leerzeichen-Padding-Semantik wird verwendet. Das heißt, beim Vergleich   Zeichenwerte ungleicher Länge, PL / SQL macht keine Anpassungen und   verwendet die genauen Längen.

Wenn Sie jetzt versuchen, a.OrderCode == orderCode zu machen, dann ist die linke Seite CHAR und die rechte Seite ist VARCHAR2 und daher wird non-blank-padding verwendet, was zu XYZ_ = XYZ ergibt false .

Also ist die Lösung, etwas wie a.OrderCode.TrimEnd() == orderCode zu verwenden, damit der Vergleich funktioniert, wenn .TrimEnd() in PL / SQL RTRIM() Funktion, die VARCHAR2 zurückgibt.

    
ViRuSTriNiTy 12.02.2018 10:34
quelle

Tags und Links