C# 将OracleParameter.Value转换为Int32
我有一个存储过程调用,如下所示:C# 将OracleParameter.Value转换为Int32,c#,oracle,casting,C#,Oracle,Casting,我有一个存储过程调用,如下所示: using (OracleConnection con = new OracleConnection(ConfigurationManager.AppSettings["Database"])) using (OracleCommand cmd = new OracleCommand("Package.Procedure", con)) { Int32 existsCount; cmd.CommandType = CommandType.Store
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());
那怎么办
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( );
您也可以尝试:
Oracle.DataAccess.Types.OracleDecimal d = (Oracle.DataAccess.Types.OracleDecimal)cmd.Parameters["successCount"].Value;
if( d.IsNull )
existsCount = 0;
else
existsCount = d.ToInt32( );
我建议您转换为
String
,然后再从String
转换为Integer
Dim tmpIdSesiónCalificación As String =
parametroIdSesiónCalificación.Value.ToString
_idSesiónCalificación = Convert.ToInt32(tmpIdSesiónCalificación)
我建议您转换为
String
,然后再从String
转换为Integer
Dim tmpIdSesiónCalificación As String =
parametroIdSesiónCalificación.Value.ToString
_idSesiónCalificación = Convert.ToInt32(tmpIdSesiónCalificación)
它的使用效率更高
Convert.ToInt32((decimal)(OracleDecimal)(cmd.Parameters["successCount"].Value))
它的使用效率更高
Convert.ToInt32((decimal)(OracleDecimal)(cmd.Parameters["successCount"].Value))
我不知道运行时的返回类型,因为执行代码位于正在开发的跨平台数据访问框架内,所以我使用参数值类型上的开关来访问各种Oracle托管数据访问类型的基础Oracle[type].value属性
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);
}
}
我不知道运行时的返回类型,因为执行代码位于正在开发的跨平台数据访问框架内,所以我使用参数值类型上的开关来访问各种Oracle托管数据访问类型的基础Oracle[type].value属性
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);
}
}
在我的例子中,我正在Oracle中使用
批量插入
,遇到同样的错误,让我在这里分享我的解决方案。我通过添加
oracleCommand.ArrayBindCount = datas.Count;
也就是说,我忘了设置
ArrayBindCount
属性。在我的例子中,我在Oracle中使用Bulk Insert
,遇到了相同的错误,让我在这里分享我的解决方案。我通过添加
oracleCommand.ArrayBindCount = datas.Count;
那就是我忘了设置
ArrayBindCount
属性。这并不愚蠢。转换成。。。如果有,应该是更好的选择。因为int.Parse()基本上只是解析字符串值,这应该会增加一些开销。但是,有一件事可能也会起作用(一开始没有考虑到),那就是:existscont=(int)cmd.Parameters[“successCount”].Value,如果Oracle库提供了显式转换。为什么要使用TryParse?如果OracleDecimal可以被解析,你应该很好。如果返回值超出int32界限,则抛出异常比默默忽略事实要好。在这种特殊情况下,int.Parse()更好(这只是我的意见)。将数值类型转换为字符串,而只是将其转换回数值,这是错误的。@GregZ。没错Oracle.DataAccess.Types.OracleDecimal
首先应该实现IConvertible,因此Convert.ToInt32(…)
会成功,但这就完成了任务。但是@Brads solutionConvert.ToInt32((十进制)(OracleDecimal)(cmd.Parameters[“successCount”].Value))
更好(但晚了四年:-)@MarkLauter需要解释吗Convert.ToInt32
具有Convert.ToInt32(对象值)
重载value:实现System.IConvertible接口的对象
换句话说:如果类型本身正确实现了IConvertible
,则在设计时不必知道类型,如果在设计时不知道类型,这一点非常有用。这并不愚蠢。转换成。。。如果有,应该是更好的选择。因为int.Parse()基本上只是解析字符串值,这应该会增加一些开销。但是,有一件事可能也会起作用(一开始没有考虑到),那就是:existscont=(int)cmd.Parameters[“successCount”].Value,如果Oracle库提供了显式转换。为什么要使用TryParse?如果OracleDecimal可以被解析,你应该很好。如果返回值超出int32界限,则抛出异常比默默忽略事实要好。在这种特殊情况下,int.Parse()更好(这只是我的意见)。将数值类型转换为字符串,而只是将其转换回数值,这是错误的。@GregZ。没错Oracle.DataAccess.Types.OracleDecimal
首先应该实现IConvertible,因此Convert.ToInt32(…)
会成功,但这就完成了任务。但是@Brads solutionConvert.ToInt32((十进制)(OracleDecimal)(cmd.Parameters[“successCount”].Value))
更好(但晚了四年:-)@MarkLauter需要解释吗Convert.ToInt32
具有Convert.ToInt32(对象值)
重载值:实现System.IConvertible接口的对象
换句话说:如果类型本身正确实现了IConvertible
,则在设计时不必知道类型。如果在设计时不知道类型,这一点非常有用。我已经测试过,它的性能比上一个解决方案。这是最正确的答案-不知道为什么它总是在底部。检查null是一个好主意,我忘记了做一些事情。我已经测试过这个,它比上一个解决方案有更好的性能。这是最正确的答案-不知道为什么它总是在底部。检查null是一个好主意还有一件事我忘了做。如果Oracle提供了对Value属性的底层本机类型的隐式转换,那就好了。如果Oracle提供了对Value属性的底层本机类型的隐式转换,那就好了。