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 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)
언급URL : https://stackoverflow.com/questions/3026036/convert-oracleparameter-value-to-int32
'programing' 카테고리의 다른 글
zsh: 일치하는 항목을 찾을 수 없음: 요청[보안] (0) | 2023.07.18 |
---|---|
scipy.pi, numpy.pi 또는 math.pi를 사용해야 합니까? (0) | 2023.07.18 |
독립 축에 시간 표시 (0) | 2023.07.18 |
텍스트 파일에 다차원 배열을 쓰는 방법은 무엇입니까? (0) | 2023.07.18 |
Python을 사용하여 gz 파일의 압축을 푸는 방법 (0) | 2023.07.18 |