我正在查看一个较旧的应用程序的冗长数据访问代码。每个函数都在调用一个存储过程来从 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 连接到这个项目。此代码中的任何内容是否会更改以与托管数据访问客户端一起使用?
- 除此之外,欢迎任何最佳实践/建议。
谢谢你。