2010-06-11 13 views
20

ho una chiamata di stored procedure che va come questo:Convertire OracleParameter.Value a Int32

using (OracleConnection con = new OracleConnection(ConfigurationManager.AppSettings["Database"])) 
using (OracleCommand cmd = new OracleCommand("Package.Procedure", con)) 
{ 
    Int32 existsCount; 

    cmd.CommandType = CommandType.StoredProcedure; 
    cmd.Parameters.Add("successCount", OracleDbType.Int32, 0, ParameterDirection.InputOutput); 
    cmd.Parameters.Add("BusinessId", OracleDbType.Int64, listRec.BusinessId, ParameterDirection.Input); 

    con.Open(); 
    cmd.ExecuteScalar(); 
    con.Close(); 

    existsCount = Convert.ToInt32(cmd.Parameters["successCount"].Value); 

    return (existsCount); 
} 

Ma su questa linea:

existsCount = Convert.ToInt32(cmd.Parameters["successCount"].Value); 

Esso genera l'eccezione "Impossibile eseguire il cast oggetto di tipo 'Oracle.DataAccess.Types.OracleDecimal' per digitare 'System.IConvertible'. "

Qualche idea? Grazie.

risposta

22

Che dire

existsCount = int.Parse(cmd.Parameters["successCount"].Value.ToString()); 
+1

destro! Grazie, mi sento un po 'stupido ora. Ma grazie mille. – FelixMM

+2

Beh, non è stupido. Convert.To ... dovrebbe essere la scelta migliore se disponibile. Poiché int.Parse() fondamentalmente analizza solo il valore stringa che dovrebbe essere un po 'più sovraccarico. Tuttavia, una cosa che potrebbe funzionare anche (non ci ho pensato in primo luogo) è: existsCount = (int) cmd.Parameters ["successCount"]. Valore se c'è una conversione esplicita fornita dalla lib Oracle. –

+2

Ouch, no TryParse? –

32

Si può anche provare:

Oracle.DataAccess.Types.OracleDecimal d = (Oracle.DataAccess.Types.OracleDecimal)cmd.Parameters["successCount"].Value; 

if(d.IsNull) 
    existsCount = 0; 
else 
    existsCount = d.ToInt32(); 
+0

Ho provato questo e ha prestazioni migliori rispetto alla soluzione precedente. – Meryovi

+2

Questa è la risposta più corretta - non so perché è completamente in fondo. –

-1

suggerisco di convertire a String, e dopo che si convertono String-Integer.

Dim tmpIdSesiónCalificación As String = 
    parametroIdSesiónCalificación.Value.ToString 
_idSesiónCalificación = Convert.ToInt32(tmpIdSesiónCalificación) 
2

E 'più efficiente di utilizzare

Convert.ToInt32((decimal)(OracleDecimal)(cmd.Parameters["successCount"].Value))