programing

Oracle 매개 변수를 변환합니다.Int32에 대한 값

javajsp 2023. 7. 18. 21:31

Oracle 매개 변수를 변환합니다.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 유형의 개체를 캐스팅할 수 없습니다."를 발생시킵니다.데이터 액세스..OracleDecimal'을 입력하고 'System'을 입력합니다.I convertable'.

무슨 생각 있어요?감사해요.

다음을 시도할 수도 있습니다.

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

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

어때

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

사용하는 것이 더 효율적입니다.

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

실행 코드가 개발 중인 크로스 플랫폼 데이터 액세스 프레임워크 내에 있기 때문에 런타임에 반환 형식을 알 수 없으므로 매개 변수 값 형식의 스위치를 사용하여 기본 Oracle[type]에 액세스했습니다.다양한 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 InsertOracle에서도 동일한 오류가 발생하면 여기서 솔루션을 공유하겠습니다.를 추가하여 해결했습니다.

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)

언급URL : https://stackoverflow.com/questions/3026036/convert-oracleparameter-value-to-int32