EF + ODP.NET + CLOB = Wert kann nicht Null sein - Parametername: byteArray?

9

Unser Projekt wurde vor kurzem auf die neueren Oracle.ManagedDataAccess-DLLs (v 4.121.2.0) aktualisiert, und dieser Fehler ist zeitweise aufgetreten. Wir haben es ein paar Mal repariert, ohne wirklich zu wissen, was wir getan haben, um es zu reparieren.

Ich bin ziemlich sicher, dass CLOB-Felder in Entity Framework Zeichenfolgen zugeordnet und dann in LINQ-Anweisungen ausgewählt werden, die ganze Entitäten anstatt nur eine begrenzte Anzahl von Eigenschaften ziehen.

Fehler:

%Vor%

Stapelverfolgung:

%Vor%

Suspect Entity Eigenschaften:

%Vor%

Aber ich bin zuversichtlich, dass dies der richtige Weg ist, die Felder pro Oracle-Matrix abzubilden:

Überblick über ODP.NET-Typen

Es gibt offensichtlich auch nichts mit der generierten SQL-Anweisung:

%Vor%

Ich habe auch diesen fließenden Code pro Ozkan's Vorschlag versucht, aber es scheint meinen Fall nicht zu beeinflussen.

%Vor%

Fehlerbehebung:

Nach ausgiebigen Tests sind wir uns ziemlich sicher, dass dies tatsächlich ein Bug ist, kein Konfigurationsproblem. Es scheint der Inhalt des CLOB zu sein, der das Problem unter sehr spezifischen Umständen verursacht. Ich habe dies in den Oracle Foren veröffentlicht und hoffe auf weitere Informationen.

    
Tom Halladay 18.02.2015, 20:43
quelle

5 Antworten

1

Wir haben dieses Problem auch auf einigen Computern und führen die neueste Oracle.ManagedDataAccess.dll (4.121.2.20150926 ODAC RELEASE 4) aus.

Wir haben eine Lösung für unser Problem gefunden, und ich wollte nur teilen.

Das war unser Problem, dass einige Computer aufgetreten sind.

%Vor%

Und hier ist die Lösung, die es auf allen Computern funktioniert hat.

%Vor%     
Ragowit 02.11.2016 10:34
quelle
0

Wir haben dieses Problem vor einer Stunde in unserem Projekt gelöst und eine Lösung gefunden. Dieser Fehler wird aufgrund von Nullwerten in CLOB-Spalten generiert. Wir haben eine CLOB-Spalte und es ist in der Datenbank Nullable. Im EntityFramework-Modell ist es String, aber nicht Nullable. Wir haben die Nullable-Eigenschaft der Spalte im EF-Modell in "True" geändert und dadurch das Problem behoben.

    
Ozkan 19.02.2015 14:32
quelle
0

Für mich war es einfach! Ich hatte diesen Fehler mit Odac v 4.121.1.0. Ich habe gerade Oracle.ManagedDataAccess auf 4.121.2.0 mit Nuget aktualisiert und jetzt funktioniert es.

Haben Sie versucht, Oracle.ManagedDataAccess mit Nugget zu deinstallieren und neu zu installieren?

    
toregua 14.04.2016 14:36
quelle
0

Nach der Installation von Oracle12 Client ist das gleiche Problem aufgetreten. In machine.config (C: \ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \ Config) habe ich alle Einträge mit Oracle.ManagedDataAccess entfernt. Im Verzeichnis C: \ Windows \ Microsoft.NET \ assembly \ GAC_MSIL habe ich sowohl Oracle.ManagedDataAccess als auch Policy.4.121.Oracle.ManagedDataAccess entfernt. Dann begann mein C # -Programm wie gewohnt mit der Oracle.ManagedDataAccess-DLL in einem eigenen Verzeichnis.

    
CasaSpider 28.12.2016 14:05
quelle
0

Ich habe viel Zeit damit verbracht, dies zu entschlüsseln und habe im Internet hier und da etwas gefunden, aber nein, wo alles an einem Ort war, also würde ich gerne posten, was ich gelernt habe, und wie ich es gelöst habe, das ist ähnlich wie Ragowits Antwort oben, aber ich habe den C # -Code dafür.

Hintergrund

Der Fehler: Also hatte ich diesen Fehler in meiner while (dr.Read()) -Zeile:

%Vor%

Ich habe im Internet sehr wenig darüber herausgefunden, außer dass es ein Fehler mit dem CLOB -Feld war, als es null war, und angeblich in der letzten ODAC-Version behoben wurde, entsprechend: Ссылка

Ich nehme das an - NICHT WAHR! Es wurde seit dem 5. Oktober 2015 ( Ссылка ) und dem 12c nicht mehr aktualisiert Das Paket, das ich verwende, wurde im April 2016 heruntergeladen.

Vollständiger Stack-Trace von jemand anderem mit dem Fehler, der sich ziemlich genau in meinem spiegelt: Ссылка

%Vor%

Wie ich darauf gestoßen bin: Es war beim Lesen einer 11-Spalten-Tabelle mit etwa 3000 Zeilen. Eine der Spalten war tatsächlich ein NCLOB (also scheinbar genauso anfällig wie CLOB ), was Nullen in der Datenbank erlaubte, und einige ihrer Werte waren leer - es war schließlich ein optionales "Notes" -Feld . Es ist lustig, dass ich diesen Fehler in der ersten oder sogar zweiten Zeile, die ein leeres Notes-Feld hatte, nicht erhalten habe. Es ist kein Fehler aufgetreten, bis Zeile 768 beendet wurde und die Zeile 769 entsprechend einer int -Zählervariablen gestartet wurde, die bei 0 begann und nach der Überprüfung der Anzahl der Zeilen, die meine DataTable bisher hatte, eingerichtet wurde. Ich habe den Fehler gefunden, wenn ich Folgendes verwendet habe:

%Vor%

auch, wenn ich:

%Vor%

oder wenn ich verwendet habe:

%Vor%

wobei cmd die OracleCommand ist, also hat es keinen Unterschied gemacht.

Auflösung

Das Folgende ist im Grunde der Code, den ich verwendet habe, um einen OracleDataReader -Wert zu analysieren, um sie einem DataTable zuzuweisen. Es ist eigentlich nicht so raffiniert wie es sein könnte - ich verwende es, um dr[i] in datarow zurückzugeben, außer wenn der Wert null ist und wenn es die elfte Spalte ist (index = 10, weil es bei beginnt 0) und eine bestimmte Abfrage wurde ausgeführt, so dass ich weiß, wo meine Spalte NCLOB ist.

%Vor%

Auf dieselbe Art und Weise, wie ich bestimmte Nulltypen basierend auf dem in der Schematabellenschleife gefundenen Spaltentyp zugewiesen habe, könnten Sie die Bedingungen der Seite "nicht null" von if...then hinzufügen und verschiedene% co_de ausführen % Aussagen dort. Ich fand jedoch, dass es nur für diese GetOracle... -Instanz notwendig war.

Um Kredit zu geben, wo Kredit fällig ist, basiert die ursprüngliche Codebasis auf der Antwort von sarathkumar um Füllen Sie die Datentabelle vom Datenleser aus .

    
vapcguy 18.11.2016 22:37
quelle