다소 오래된 앱의 긴 데이터 액세스 코드를 살펴 보겠습니다. 모든 함수는 저장 프로 시저를 호출하여 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