"Die angegebene Umwandlung ist ungültig", wenn das Auffüllen der Datentabelle aus OracleDataAdapter.Fill()
Ich kann nicht scheinen, um herauszufinden, diese Frage überall auf Google (oder StackOverflow), die mich wirklich überrascht, also ich bin setzen Sie auf hier, um anderen zu helfen in der gleichen situation.
Ich habe eine SQL-Abfrage, die gut läuft auf Oracle Sql-Developer, aber wenn ich es durch C#
mitadapter.Fill(table)
um die Ergebnisse zu bekommen, bekomme ich Specified cast is not valid
Fehler (System.InvalidCastException
).
Hier ist die cut-down-version der C# - code:
var resultsTable = new DataTable();
using (var adapter = new OracleDataAdapter(cmd))
{
var rows = adapter.Fill(resultsTable); //exception thrown here, but sql runs fine on Sql Dev
return resultsTable;
}
Und hier ist eine vereinfachte version des SQL:
SELECT acct_no, market_value/mv_total
FROM myTable
WHERE NVL(market_value, 0) != 0
AND NVL(mv_total, 0) != 0
Wenn ich entfernen Sie die division-Klausel, ist es nicht Fehler - so ist es speziell auf, die. Jedoch, beide market_value und mv_total
sind vom Typ Number(19,4) und ich kann sehen, dass die Oracle-adapter erwartet eine dezimale, so was gegossen ist statt? Warum funktioniert es auf SqlDev aber nicht in C#?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Beantwortung meiner eigenen Frage:
So scheint es, dass der Oracle-Nummer geben kann, halten viele mehr Nachkommastellen als die C# - dezimal-Typ und wenn Oracle versucht, mehr zurück, als C# halten kann, wirft Sie das InvalidCastException.
Lösung?
In Ihre sql-Runde alle Ergebnisse, die möglicherweise zu viele Dezimalstellen auf etwas vernünftiges. Also ich habe das:
Und es funktionierte.
Den take-away: Inkompatibilität zwischen Oracle number-Typ und C# - dezimal. Beschränken Sie Ihre Oracle Dezimalstellen zu vermeiden, wird die ungültige Besetzung Ausnahmen.
Hoffe, dies hilft jemand anderes!
Ich weiß, dieser thread ist wirklich alt.. Aber ich hatte ein ähnliches Problem.
Die beste Lösung, die ich verwenden müssen Sie die Oracle-Methode TO_BINARY_DOUBLE auf Oracle-Decimal-Spalte
Ich weiß, das wurde bereits beantwortet, aber ich fand auch eine weitere alternative, die ich als gut. Ich verwendet einen CAST auf das Feld, das gab mir Probleme.
Basiert auf OP ' s SELECT-Befehl: