Ответ 1
Что насчет
existsCount = int.Parse(cmd.Parameters["successCount"].Value.ToString());
У меня есть вызов хранимой процедуры, который выглядит следующим образом:
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 ".
Любые мысли? Спасибо.
Что насчет
existsCount = int.Parse(cmd.Parameters["successCount"].Value.ToString());
Вы также можете попробовать:
Oracle.DataAccess.Types.OracleDecimal d = (Oracle.DataAccess.Types.OracleDecimal)cmd.Parameters["successCount"].Value;
if( d.IsNull )
existsCount = 0;
else
existsCount = d.ToInt32( );
Эффективно использовать
Convert.ToInt32((decimal)(OracleDecimal)(cmd.Parameters["successCount"].Value))
Я не знаю тип возвращаемого значения во время выполнения, потому что код выполнения находится в разрабатываемой кроссплатформенной структуре доступа к данным, поэтому я использовал переключатель на типе значения параметра для доступа к базовому свойству 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);
}
}
В моем случае я использую Bulk Insert
в Oracle и встречаю ту же ошибку, позвольте мне поделиться своим решением здесь. Я решил это, добавив
oracleCommand.ArrayBindCount = datas.Count;
то есть я забыл установить свойство ArrayBindCount
.
Я предлагаю вам конвертировать в String
, после чего вы конвертируете из String
в Integer
.
Dim tmpIdSesiónCalificación As String =
parametroIdSesiónCalificación.Value.ToString
_idSesiónCalificación = Convert.ToInt32(tmpIdSesiónCalificación)