0

少し古いアプリの長いデータ アクセス コードについて説明します。すべての関数は、Oracle DB から何かを選択するためにストアド プロシージャを呼び出しています。すべての関数は多かれ少なかれ以下のコードのように見えます:

public List<SomeObject> GetMeSomethingFromDB(string myParam, int anotherParam)
{
    OracleConnection conn = null;
    OracleDataReader dataReader = null;
    try
    {
        conn = new OracleConnection(Settings.ConnectionString);
        conn.Open();

        var cmd = new OracleCommand("STORED_PROC_NAME", conn);
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.Parameters.Add(new OracleParameter("IN_MY_PARAM", OracleDbType.Varchar2)).Value = myParam;
        cmd.Parameters.Add(new OracleParameter("IN_ANOTHER_PARAM", OracleDbType.Int32)).Value = anotherParam;
        cmd.Parameters.Add(new OracleParameter("OUT_REF_CURSOR", OracleDbType.RefCursor)).Direction = ParameterDirection.Output;
        dataReader = cmd.ExecuteReader();

        List<SomeObject> result = new List<SomeObject>();
        if (dataReader == null || !dataReader.HasRows) return result;

        while (dataReader.Read())
        {
            SomeObject someObject = new SomeObject
            {
                SomeId = (int)dataReader["SOME_ID"],
                SomeStringValue = dataReader["SOME_STRING_VALUE"].ToString()
            };

            result.Add(someObject);
        }

        return result;
    }
    catch (Exception e)
    {
        throw e;
    }
    finally
    {
        if (dataReader != null)
        {
            dataReader.Close();
            dataReader.Dispose();
        }
        if (conn != null)
        {
            if (conn.State == ConnectionState.Open) conn.Close();
            conn.Dispose();
        }
    }
}

私の質問は次のとおりです。

  1. 一部の関数は、代わりにクラス レベルの OracleConnection 変数を使用します。関数レベルまたはクラスレベル変数のどちらが優先されますか?
  2. チェックはdataReader == null必要ですか?cmd.ExecuteReader()呼び出し後に NULL になることはありますか?
  3. 接続のクローズ/ディスポーズとリーダーのクローズ/ディスポーズでは、機能が異なります。閉じる/処分する正しい方法/順序は何ですか? 接続が破棄された場合、リーダーは自動的に閉じる/破棄しませんか?
  4. 近い将来、このプロジェクトに Oracle.ManagedDataAccess.Client を接続したいと考えています。マネージド データ アクセス クライアントで動作するように、このコードに何か変更はありますか?
  5. その他、ベストプラクティス/提案は大歓迎です。

ありがとうございました。

4

1 に答える 1