web-dev-qa-db-ja.com

OracleDataReaderを介して読み取るときにNULL値を処理しますか?

私は最初のASP.Netアプリケーションに取り組んでおり、多くのハードルにぶつかっているようです(主にWinFormsのバックグラウンドで、最近のMVC5プロジェクトが私のベルトの下にあります)。

OracleCommandを使用してDB接続を正常に確立し、クエリを実行していますが、行を読み取ろうとすると、odr.GetDecimal(1)の2番目の行に_Column contains NULL value_が表示されます。 OracleDataReaderを介して読み取るときにnull値を処理する方法を知っている人はいますか?

以下は私のコードです:

_        List<YearsOfService> yearsOfService = new List<YearsOfService>();
        string SQL = "SELECT SCHOOL_YEAR as YEAR, " +
                            "TOTAL_SERVICE_CREDIT as ServiceCredited, " +
                            "RETIREMENT_SALARY as Salary, " +
                            "SOURCE_VALUE as CoveredEmployer " +
                     "FROM " + Schema + ".RANDOM_Oracle_TABLE a " +
                     "WHERE MEMBER_ACCOUNT_ID = :memberAccountId";

        DbConnection dbc = new DbConnection();
        OracleCommand cmd = dbc.GetCommand(SQL);
        cmd.Parameters.Add(new OracleParameter("memberAccountId", memberAccountId));
        OracleDataReader odr = cmd.ExecuteReader();

        int counter = 0;
        if (odr.HasRows)
        {
            while (odr.Read())
            {
                YearsOfService yos = new YearsOfService();
                yos.Year = odr.GetInt16(0);
                yos.ServiceCredited = odr.GetDecimal(1); // Error on Second Pass

                yos.Salary = odr.GetDecimal(2);

                yos.CoveredEmployer = odr.GetString(3);

                yearsOfService.Add(yos);
                counter++;
            }
        }

        return yearsOfService;
    }
_

NULLの簡単なチェックを考えていたので、0に置き換えると(Decimal値が期待されるため)、次のように機能しますが、うまくいきません。同じエラー:yos.ServiceCredited = Convert.IsDBNull(odr.GetDecimal(1)) ? 0 : odr.GetDecimal(1);

完全なエラーは次のとおりです。

タイプ 'System.InvalidCastException'の例外がOracle.DataAccess.dllで発生しましたが、ユーザーコードでは処理されませんでした

追加情報:列にNULLデータが含まれています

返される2つの行が次の形式であることを確認しました。

_Year|CreditedService|Salary  |CoveredEmployer
2013|0.70128        |34949.66|ER
2014|NULL           | 2213.99|NULL
_

誰かが最善の進め方についてアドバイスがありますか? OracleDataReaderを介して読み取るときにNULL値の受信をどのように処理する必要がありますか?

11
_yos.ServiceCredited = odr.IsDBNull(1) ? 0 : odr.GetDecimal(1);
_

OracleDataReaderIsDBNull()メソッドを提供します。

そして GetDecimal() のドキュメントはこれを行うように私たちに依頼します

このメソッドを呼び出す前に、IsDBNullを呼び出してnull値を確認してください。

28