2009-12-15 16 views
8

So che ci sono diversi thread e post relativi a questo problema in Internet e li ho letti (non tutti gli articoli, devo ammettere) ma nessuno di questi mi ha soddisfatto pienamente.Numero Oracle a C# decimale

La mia situazione:
sto usando ODP.net (dll versione 2.111.6.0) per accedere al DB di Oracle (versione 10 + 11) e un DataReader per recuperare i dati (.NET 3.5, C#).

Utilizzando questo codice genera un ' System.OverflowException (operazione aritmetica determinato un trabocco.)'


decimal.TryParse(oraReader.GetOracleDecimal(0).Value.ToString(), 
    NumberStyles.Any, null, out parsedOraDecimal) 

e questo si traduce in un valore di ' 3,000000000000000000000000000000000000000000000000000000000E-126'


decimal.TryParse(oraReader.GetOracleValue(0).ToString(), 
    NumberStyles.Any, null, out parsedOraDecimal) 

Ora devo trovare un modo per recuperare e valutare correttamente questo valore - il DB è utilizzata anche da altre applicazioni che sono fuori dal mio controllo quindi i cambiamenti non sono possibili.

Anche la conversione dei tipi nel mio codice C# da "decimale" a "doppio" non è realmente un'opzione.

Qualche idea?

risposta

8

Ho appena avuto un problema simile, e ho provato l'approccio di cambiare l'OracleDataAdapter per tornare tipi specifici di Oracle (data_adapter.ReturnProviderSpecificTypes = true;), ma questo è solo una valle di lacrime, si finisce per lanciare OracleStrings torna a stringhe, ecc

alla fine ho risolto facendo la precisione di arrotondamento nell'istruzione SQL utilizzando la funzione rotonda di Oracle:

SELECT round(myfield, 18) FROM mytable 

Dotnet sarà poi lieto di convertire la figura a un de cimal.

+0

Ciao Dave, grazie per il suggerimento! –

+1

Questo fallisce su numeri molto grandi – Stig

15

OracleDecimal ha una precisione maggiore del decimale. Per questo motivo, devi prima ridurre la precisione. Dimentica tutte le analisi, usa la conversione implicita. Provare qualcosa sulla falsariga di (non testata):

decimal d = (decimal)(OracleDecimal.SetPrecision(oraReader.GetOracleDecimal(0), 28)); 
+4

Odio Oracle; Quindi tutti vogliono solo un decimale normale, eppure Oracle ci fa saltare attraverso i cerchi. – eschneider

+1

Grazie, ho usato questo come soluzione. la mia prima collaborazione con il provider Oracle non è stata piacevole ... – Etch

+1

eschneider: Oracle ha avuto il precission più grande prima dell'invenzione di C#, quindi devono fare qualcosa che permetta di utilizzare la precisione completa che il database ha da offrire. –