Подтвердить что ты не робот

Преобразование OracleParameter.Value в 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);
}

Но на этой строке:

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

Он выдает исключение "Невозможно передать объект типа" Oracle.DataAccess.Types.OracleDecimal "для ввода" System.IConvertible ".

Любые мысли? Спасибо.

4b9b3361

Ответ 1

Что насчет

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

Ответ 2

Вы также можете попробовать:

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

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

Ответ 3

Эффективно использовать

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

Ответ 4

Я не знаю тип возвращаемого значения во время выполнения, потому что код выполнения находится в разрабатываемой кроссплатформенной структуре доступа к данным, поэтому я использовал переключатель на типе значения параметра для доступа к базовому свойству 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);
    }
}

Ответ 5

В моем случае я использую Bulk Insert в Oracle и встречаю ту же ошибку, позвольте мне поделиться своим решением здесь. Я решил это, добавив

oracleCommand.ArrayBindCount = datas.Count; 

то есть я забыл установить свойство ArrayBindCount.

Ответ 6

Я предлагаю вам конвертировать в String, после чего вы конвертируете из String в Integer.

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