“Cast spécifié n'est pas valide” lorsque le remplissage de Table de OracleDataAdapter.Fill()
Je n'arrive pas à trouver cette question n'importe où sur Google (ou StackOverflow), qui m'a vraiment surpris, donc je suis en train de mettre sur ici pour aider les autres dans la même situation.
J'ai une requête SQL qui fonctionne très bien sur Oracle Sql Developer, mais quand je le lance à travers C#
à l'aide deadapter.Fill(table)
pour obtenir les résultats, je reçois Specified cast is not valid
erreurs (System.InvalidCastException
).
Ici est coupe-bas version de code C#:
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;
}
Et voici une version simplifiée de la SQL:
SELECT acct_no, market_value/mv_total
FROM myTable
WHERE NVL(market_value, 0) != 0
AND NVL(mv_total, 0) != 0
Si je supprime la clause de division, il n'a pas d'erreur donc c'est spécifique à l'. Toutefois, les deux market_value et mv_total
sont de type(19,4) et je peux voir que l'adaptateur Oracle s'attend à une décimale, donc ce casting a lieu? Pourquoi fonctionne-t-il SqlDev mais pas en C#?
Vous devez vous connecter pour publier un commentaire.
Pour répondre à ma propre question:
Il semble donc que l'Oracle numéro de type peut contenir beaucoup plus de décimales que le C# de type decimal et si Oracle est en train d'essayer de retourner plus de C# peut contenir, il jette le InvalidCastException.
Solution?
Dans votre sql, tour les résultats qui pourraient avoir trop de décimales à quelque chose de sensible. J'ai donc fait ceci:
Et cela a fonctionné.
Le take-away: Incompatibilité entre Oracle numéro de type et de C# décimal. Restreindre votre Oracle décimales pour éviter les invalides fonte des exceptions.
Espère que cela aide quelqu'un d'autre!
Je sais que ce fil est vraiment vieux.. Cependant j'ai eu un problème similaire.
La meilleure solution que j'ai d'utiliser l'Oracle méthode TO_BINARY_DOUBLE sur Oracle colonne Decimal
Je sais que cela a déjà répondu, mais j'ai aussi trouvé une autre solution que j'utilise aussi. J'ai utilisé un CAST sur le terrain qui me donnait des ennuis.
Basé sur les OP de la commande SELECT: