web-dev-qa-db-ja.com

OracleParameter.Valueを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.DataAccess.Types.OracleDecimal」のオブジェクトをタイプ「System.IConvertible」にキャストできません」がスローされます。

何かご意見は?ありがとう。

27
Felix Martinez

どうですか

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

あなたも試すことができます:

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

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

使用する方が効率的です

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

実行コードは開発中のクロスプラットフォームデータアクセスフレームワーク内にあるため、実行時の戻り値の型はわかりません。パラメーター値の型のスイッチを使用して、さまざまな基になる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);
    }
}
0
Mark Lauter

私の場合、Bulk Insert Oracleで同じエラーが発生した場合は、ここで私の解決策を共有しましょう。追加して解決しました

oracleCommand.ArrayBindCount = datas.Count; 

つまり、ArrayBindCountプロパティを設定するのを忘れていました。

0
yu yang Jian