我有一个存储过程调用,如下所示:
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'。”
有什么想法?感谢。
答案 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)