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?
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.
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.
Tags und Links entity-framework linq odp.net