Search code examples
c#arraysoraclestored-proceduresimplicit-conversion

Cast array returned from Oracle stored procedure


I am having difficulty reading values from the following object type array returned from Oracle stored procedure

var arrUtil = cmd.Parameters["UTILBYDAY"].Value;

The arrUtil array is of the below type and has these values. Any idea how to cast it to double type in c#?

{Oracle.ManagedDataAccess.Types.OracleDecimal[10]}
    [0]: {28.16901408450704225352112676056338028169}
    [1]: {57.24381625441696113074204946996466431095}
    [2]: {29.34782608695652173913043478260869565217}
    [3]: {22.02166064981949458483754512635379061372}
    [4]: {70.56737588652482269503546099290780141844}
    [5]: {79.78723404255319148936170212765957446809}
    [6]: {62.41134751773049645390070921985815602837}
    [7]: {23.40425531914893617021276595744680851064}
    [8]: {5.31914893617021276595744680851063829787}
    [9]: {63.507109004739336492890995260663507109}

I have tried to cast it to double using

double[] arraUtil = (double[]) cmd.Parameters["UTILBYDAY"].Value;

but it ended up in error that said unable to cast Oracle.ManagedDataAccess.Types.OracleDecimal[] to double[].

I have also tried googled around but couldn't find anything helpful. Any help is appreciated. Thank you.


Solution

  • Oracle.ManagedDataAccess.Types.OracleDecimal type defines an explicit cast operator to convert its value to double type.

    You can convert them like this:

    using System.Linq;
    using Oracle.ManagedDataAccess.Types;
    
    OracleDecimal[] arrUtil = cmd.Parameters["UTILBYDAY"].Value;
    
    // Convert to double
    double[] utils = arrUtil.Select(util => (double)util).ToArray();
    
    // Convert to decimal
    decimal[] utils = arrUtil.Select(util => (decimal)util).ToArray();
    
    // Please note: This does NOT work!
    double[] utils = arrUtil.Cast<double>().ToArray();
    

    You can cast OracleDecimal to byte, short, int, long, float, double and decimal.

    Here you can find all the explicit cast operators.