もう少し古いアプリのデータアクセスコードが長くなります。すべての関数がストアド・プロシージャを呼び出して、Oracle DBから何かを選択しています。すべてのより多くの機能または以下のコードのようにそれほどルックス:Oracle.DataAccess.Clientのベストプラクティスは何ですか?
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をこのプロジェクトにフックアップする予定です。このコードの内容は、管理対象データアクセスクライアントで動作するように変更されますか?
- 他にも、ベストプラクティス/提案が歓迎されます。
ありがとうございます。
キャッチされた例外を再実行するときは、 'throw e;'をしないでください。ちょうど 'throw;'を実行すると、スタックトレースが保存されます。 – mason
@mason - ありがとう – Dimskiy