Ich gehe über einen längeren Datenzugriffscode einer etwas älteren App. Jede Funktion ruft eine gespeicherte Prozedur auf, um etwas aus Oracle DB auszuwählen. Jede Funktion mehr oder weniger sieht aus wie dem folgenden Code:Welche Best Practices arbeiten mit 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();
}
}
}
Meine Fragen sind:
- Einige Funktionen statt Klassenstufe OracleConnection Variable verwenden. Was ist bevorzugt - Funktionsebene oder Klassenebene variabel?
- Ist die Prüfung
dataReader == null
erforderlich? Wäre es jemals NULL nachcmd.ExecuteReader()
Anruf? - Die Funktionen unterscheiden sich, wenn es um die Verbindung Schließen/Dispose und Leser Close/Dispose geht. Was ist der richtige Weg um zu schließen? Würde der Leser nicht automatisch geschlossen/entsorgen, wenn die Verbindung entsorgt wird?
- Ich suche Oracle.ManagedDataAccess.Client zu diesem Projekt in naher Zukunft zu verbinden. Wird irgendetwas in diesem Code geändert, um mit dem Client für verwalteten Datenzugriff zu arbeiten?
- Alles andere, Best Practices/Vorschläge sind willkommen.
Vielen Dank.
Wenn Sie eine gefangene Ausnahme erneut auslösen, tun Sie nicht 'throw e;'. Tun Sie einfach 'throw;', damit Sie Ihre Stack-Trace beibehalten. – mason
@ Mason - danke – Dimskiy