2010-06-11 10 views
20

Ich habe eine gespeicherte Prozedur-Aufruf, der so geht:konvertieren OracleParameter.Value zu 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); 
} 

Aber auf dieser Linie:

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

Es die Ausnahme „Kann nicht wirft Objekt vom Typ werfen 'Oracle.DataAccess.Types.OracleDecimal' um 'System.IConvertible' einzugeben. "

Irgendwelche Gedanken? Vielen Dank.

Antwort

22

Was

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

Rechts zu verwenden! Danke, ich fühle mich irgendwie blöd. Aber vielen Dank. – FelixMM

+2

Nun, das ist nicht dumm. Convert.To ... sollte die bessere Wahl sein, wenn sie verfügbar ist. Da int.Parse() im Grunde nur den String-Wert analysiert, der etwas mehr Overhead sein sollte. Eine Sache, die auch funktionieren könnte (habe nicht darüber nachgedacht) ist: existsCount = (int) cmd.Parameters ["successCount"]. Wert wenn eine explizite Konvertierung von der Oracle-Bibliothek zur Verfügung gestellt wird. –

+2

Autsch, kein TryParse? –

32

können Sie auch versuchen:

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

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

Ich habe dies getestet und es hat eine bessere Leistung als die vorherige Lösung. – Meryovi

+2

Dies ist die richtigste Antwort - weiß nicht, warum es ganz unten ist. –

-1

Ich schlage vor, Sie zu String konvertieren und danach konvertieren Sie String-Integer.

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

Es ist effizienter

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