将OracleParameter.Value转换为Int32

时间:2010-06-11 20:32:36

标签: c# oracle casting

我有一个存储过程调用,如下所示:

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);
}

但是就这一行:

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

抛出异常“无法将类型为'Oracle.DataAccess.Types.OracleDecimal'的对象强制转换为'System.IConvertible'。”

有什么想法?感谢。

6 个答案:

答案 0 :(得分:40)

您也可以尝试:

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

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

答案 1 :(得分:26)

怎么样?
existsCount = int.Parse(cmd.Parameters["successCount"].Value.ToString());

答案 2 :(得分:3)

使用

效率更高
Convert.ToInt32((decimal)(OracleDecimal)(cmd.Parameters["successCount"].Value))

答案 3 :(得分:0)

我不知道运行时的返回类型,因为执行代码位于正在开发的跨平台数据访问框架中,因此我使用了参数值类型上的开关来访问基础Oracle [type] .Value属性适用于各种Oracle托管数据访问类型。

public override object GetValue(IDataParameter parameter)
{
    if (parameter == null)
    {
        throw new ArgumentNullException(nameof(parameter));
    }

    // https://docs.oracle.com/cd/B19306_01/win.102/b14307/OracleDbTypeEnumerationType.htm
    if (parameter is OracleParameter)
    {
        switch (parameter.Value)
        {
            case OracleBinary oracleBinary:
                // returns byte[]
                return oracleBinary.Value;
            case OracleBoolean oracleBoolean:
                // returns bool
                return oracleBoolean.Value;
            case OracleDate oracleDate:
                // returns DateTime
                return oracleDate.Value;
            case OracleDecimal oracleDecimal:
                // oracleDecimal.Value is Decimal, so we convert to correct type.
                return parameter.DbType == DbType.Decimal
                    ? oracleDecimal.Value
                    : Convert.ChangeType(oracleDecimal.Value, parameter.DbType.ToType());
            case OracleIntervalDS oracleIntervalDS:
                // returns TimeSpan
                return oracleIntervalDS.Value;
            case OracleIntervalYM oracleIntervalYM:
                // returns Long
                return oracleIntervalYM.Value;
            case OracleTimeStamp oracleTimeStamp:
                // returns DateTime
                return oracleTimeStamp.Value;
            case OracleTimeStampLTZ oracleTimeStampLTZ:
                // returns DateTime
                return oracleTimeStampLTZ.Value;
            case OracleTimeStampTZ oracleTimeStampTZ:
                // returns DateTime
                return oracleTimeStampTZ.Value;
            default:
                throw new NotSupportedException(
                    parameter.Value != null
                        ? parameter.Value.GetType().Name
                        : parameter.ParameterName);
        }
    }
    else
    {
        throw new NotSupportedException(parameter.GetType().Name);
    }
}

答案 4 :(得分:0)

就我而言,我在Oracle中使用Bulk Insert,并且遇到相同的错误,请允许我在这里分享我的解决方案。我通过添加

解决了
oracleCommand.ArrayBindCount = datas.Count; 

那是我忘记设置ArrayBindCount属性。

答案 5 :(得分:-1)

我建议您转换为String,然后将String转换为Integer

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