Bei der IO-Arbeit Code ich eine Ausnahme erwarten.
SqlConnection conn = null;
SqlCommand cmd = null;
try
{
conn = new SqlConnection(Settings.Default.qlsdat_extensionsConnectionString)
cmd = new SqlCommand(reportDataSource, conn);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("@Year", SqlDbType.Char, 4).Value = year;
cmd.Parameters.Add("@startDate", SqlDbType.DateTime).Value = start;
cmd.Parameters.Add("@endDate", SqlDbType.DateTime).Value = end;
conn.Open(); //opens connection
DataSet dset = new DataSet();
new SqlDataAdapter(cmd).Fill(dset);
this.gridDataSource.DataSource = dset.Tables[0];
}
catch(Exception ex)
{
Logger.Log(ex);
throw;
}
finally
{
if(conn != null)
conn.Dispose();
if(cmd != null)
cmd.Dispose();
}
Edit: explizit sein, ich vermeiden, die mit Block hier, weil ich es für wichtig halte, um in Situationen wie diese zu protokollieren. Die Erfahrung hat mich gelehrt, dass man nie weiß, welche seltsame Ausnahme auftauchen könnte. Wenn Sie diese Situation protokollieren, können Sie möglicherweise einen Deadlock erkennen oder herausfinden, wo sich eine Änderung des Schemas auf einen wenig genutzten und wenig getesteten Teil Ihrer Codebasis oder auf eine beliebige Anzahl anderer Probleme auswirkt.
Edit 2: Man kann argumentieren, dass ein using-Block eine try/catch in dieser Situation wickeln könnte, und das ist vollständig gültig und funktionell gleichwertig. Dies läuft auf die Präferenz hinaus. Möchten Sie die zusätzliche Verschachtelung auf Kosten der eigenen Entsorgung vermeiden? Oder erleiden Sie die zusätzliche Verschachtelung, um automatisch entsorgt zu werden. Ich fühle, dass Ersteres sauberer ist, also mache ich es so. Allerdings schreibe ich das letztere nicht neu, wenn ich es in der Code-Basis finde, in der ich arbeite.
Edit 3: Ich wünschte wirklich, MS hätte eine explizitere Version von using() erstellt, die es intuitiver machte, was wirklich passierte, und in diesem Fall mehr Flexibilität erhielt. Betrachten Sie den folgenden, imaginären Code:
SqlConnection conn = null;
SqlCommand cmd = null;
using(conn = new SqlConnection(Settings.Default.qlsdat_extensionsConnectionString),
cmd = new SqlCommand(reportDataSource, conn)
{
conn = new SqlConnection(Settings.Default.qlsdat_extensionsConnectionString);
cmd = new SqlCommand(reportDataSource, conn);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("@Year", SqlDbType.Char, 4).Value = year;
cmd.Parameters.Add("@startDate", SqlDbType.DateTime).Value = start;
cmd.Parameters.Add("@endDate", SqlDbType.DateTime).Value = end;
cmd.Open();
DataSet dset = new DataSet();
new SqlDataAdapter(cmd).Fill(dset);
this.gridDataSource.DataSource = dset.Tables[0];
}
catch(Exception ex)
{
Logger.Log(ex);
throw;
}
A mit Anweisung erstellt nur ein try/finally mit Dispose() ruft in der schließlich. Warum nicht dem Entwickler eine einheitliche Möglichkeit geben, die Entsorgung und die Ausnahmebehandlung zu erledigen?
Sie haben nichts über das Erfassen von unvorhergesehenen Fehlern mit db-Verbindung erzählt ... –