Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/262.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将OracleParameter.Value转换为Int32_C#_Oracle_Casting - Fatal编程技术网

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 solution
Convert.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 solution
Convert.ToInt32((十进制)(OracleDecimal)(cmd.Parameters[“successCount”].Value))
更好(但晚了四年:-)@MarkLauter需要解释吗
Convert.ToInt32
具有
Convert.ToInt32(对象值)
重载
值:实现System.IConvertible接口的对象
换句话说:如果类型本身正确实现了
IConvertible
,则在设计时不必知道类型。如果在设计时不知道类型,这一点非常有用。我已经测试过,它的性能比上一个解决方案。这是最正确的答案-不知道为什么它总是在底部。检查null是一个好主意,我忘记了做一些事情。我已经测试过这个,它比上一个解决方案有更好的性能。这是最正确的答案-不知道为什么它总是在底部。检查null是一个好主意还有一件事我忘了做。如果Oracle提供了对Value属性的底层本机类型的隐式转换,那就好了。如果Oracle提供了对Value属性的底层本机类型的隐式转换,那就好了。