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