次のようなストアドプロシージャコールがあります。
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());
あなたも試すことができます:
Oracle.DataAccess.Types.OracleDecimal d = (Oracle.DataAccess.Types.OracleDecimal)cmd.Parameters["successCount"].Value;
if( d.IsNull )
existsCount = 0;
else
existsCount = d.ToInt32( );
使用する方が効率的です
Convert.ToInt32((decimal)(OracleDecimal)(cmd.Parameters["successCount"].Value))
実行コードは開発中のクロスプラットフォームデータアクセスフレームワーク内にあるため、実行時の戻り値の型はわかりません。パラメーター値の型のスイッチを使用して、さまざまな基になる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);
}
}
私の場合、Bulk Insert
Oracleで同じエラーが発生した場合は、ここで私の解決策を共有しましょう。追加して解決しました
oracleCommand.ArrayBindCount = datas.Count;
つまり、ArrayBindCount
プロパティを設定するのを忘れていました。