Pertanyaan pertama:
Katakanlah saya punya
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
string storedProc = "GetData";
SqlCommand command = new SqlCommand(storedProc, connection);
command.CommandType = CommandType.StoredProcedure;
command.Parameters.Add(new SqlParameter("@EmployeeID", employeeID));
return (byte[])command.ExecuteScalar();
}
Apakah koneksi ditutup? Karena secara teknis kami tidak pernah mencapai yang terakhir }
seperti return
sebelumnya.
Pertanyaan kedua:
Kali ini saya punya:
try
{
using (SqlConnection connection = new SqlConnection(connectionString))
{
int employeeID = findEmployeeID();
connection.Open();
SqlCommand command = new SqlCommand("UpdateEmployeeTable", connection);
command.CommandType = CommandType.StoredProcedure;
command.Parameters.Add(new SqlParameter("@EmployeeID", employeeID));
command.CommandTimeout = 5;
command.ExecuteNonQuery();
}
}
catch (Exception) { /*Handle error*/ }
Sekarang, katakan di suatu tempat di try
kita mendapat kesalahan dan itu tertangkap. Apakah koneksi masih tertutup? Karena sekali lagi, kami melewatkan sisa kode di try
dan langsung ke catch
pernyataan.
Apakah saya berpikir terlalu linier dalam cara using
kerjanya? yaitu Apakah Dispose()
langsung dipanggil saat kita meninggalkan using
ruang lingkup?
sumber
try catch
dalamusing
Anda dapat secara eksplisit.Commit
atau.Rollback
transaksi dicatch
. Ini lebih mudah dibaca dan eksplisit, dan memungkinkan Anda untuk berkomitmen jika itu masuk akal dengan diberikan jenis pengecualian. (Transaksi secara implisit berputar kembaliconn.Close
jika tidak dilakukan.).Open
koneksi.using
hanya menjamin bahwa metode objekDispose
dipanggil.Ya untuk kedua pertanyaan tersebut. Pernyataan using dikompilasi menjadi blok coba / akhirnya
using (SqlConnection connection = new SqlConnection(connectionString)) { }
sama dengan
SqlConnection connection = null; try { connection = new SqlConnection(connectionString); } finally { if(connection != null) ((IDisposable)connection).Dispose(); }
Sunting: Memperbaiki cast ke Disposable http://msdn.microsoft.com/en-us/library/yh598w02.aspx
sumber
Ini Template saya. Semua yang Anda butuhkan untuk memilih data dari server SQL. Koneksi ditutup dan dibuang dan kesalahan dalam koneksi dan eksekusi tertangkap.
string connString = System.Configuration.ConfigurationManager.ConnectionStrings["CompanyServer"].ConnectionString; string selectStatement = @" SELECT TOP 1 Person FROM CorporateOffice WHERE HeadUpAss = 1 AND Title LIKE 'C-Level%' ORDER BY IntelligenceQuotient DESC "; using (SqlConnection conn = new SqlConnection(connString)) { using (SqlCommand comm = new SqlCommand(selectStatement, conn)) { try { conn.Open(); using (SqlDataReader dr = comm.ExecuteReader()) { if (dr.HasRows) { while (dr.Read()) { Console.WriteLine(dr["Person"].ToString()); } } else Console.WriteLine("No C-Level with Head Up Ass Found!? (Very Odd)"); } } catch (Exception e) { Console.WriteLine("Error: " + e.Message); } if (conn.State == System.Data.ConnectionState.Open) conn.Close(); } }
* Direvisi: 2015-11-09 *
Seperti yang disarankan oleh NickG; Jika terlalu banyak kawat gigi yang mengganggu Anda, format seperti ini ...
using (SqlConnection conn = new SqlConnection(connString)) using (SqlCommand comm = new SqlCommand(selectStatement, conn)) { try { conn.Open(); using (SqlDataReader dr = comm.ExecuteReader()) if (dr.HasRows) while (dr.Read()) Console.WriteLine(dr["Person"].ToString()); else Console.WriteLine("No C-Level with Head Up Ass Found!? (Very Odd)"); } catch (Exception e) { Console.WriteLine("Error: " + e.Message); } if (conn.State == System.Data.ConnectionState.Open) conn.Close(); }
Kemudian lagi, jika Anda bekerja untuk game EA atau DayBreak, Anda juga dapat mengabaikan jeda baris karena itu hanya untuk orang-orang yang harus kembali dan melihat kode Anda nanti dan siapa yang benar-benar peduli? Apakah saya benar? Maksud saya 1 baris, bukan 23 berarti saya programmer yang lebih baik, bukan?
using (SqlConnection conn = new SqlConnection(connString)) using (SqlCommand comm = new SqlCommand(selectStatement, conn)) { try { conn.Open(); using (SqlDataReader dr = comm.ExecuteReader()) if (dr.HasRows) while (dr.Read()) Console.WriteLine(dr["Person"].ToString()); else Console.WriteLine("No C-Level with Head Up Ass Found!? (Very Odd)"); } catch (Exception e) { Console.WriteLine("Error: " + e.Message); } if (conn.State == System.Data.ConnectionState.Open) conn.Close(); }
Fiuh ... Oke. Saya mendapatkan itu dari sistem saya dan saya selesai menghibur diri untuk sementara waktu. Lanjut.
sumber
conn.Close();
di akhir? Bukankahusing
pernyataan melakukannya untuk Anda melalui pembuangan?Buang hanya akan dipanggil saat Anda meninggalkan ruang lingkup penggunaan. Maksud dari "menggunakan" adalah untuk memberi pengembang cara yang terjamin untuk memastikan bahwa sumber daya dibuang.
Dari MSDN :
sumber
Using
menghasilkan percobaan / akhirnya di sekitar objek yang dialokasikan dan panggilanDispose()
untuk Anda.Anda tidak perlu repot membuat blokir dan panggilan coba / akhirnya secara manual
Dispose()
sumber
Dalam contoh pertama Anda, kompilator C # sebenarnya akan menerjemahkan pernyataan using sebagai berikut:
SqlConnection connection = new SqlConnection(connectionString)); try { connection.Open(); string storedProc = "GetData"; SqlCommand command = new SqlCommand(storedProc, connection); command.CommandType = CommandType.StoredProcedure; command.Parameters.Add(new SqlParameter("@EmployeeID", employeeID)); return (byte[])command.ExecuteScalar(); } finally { connection.Dispose(); }
Akhirnya pernyataan akan selalu dipanggil sebelum fungsi kembali dan koneksi akan selalu ditutup / dibuang.
Jadi, dalam contoh kedua Anda, kode akan dikompilasi menjadi yang berikut:
try { try { connection.Open(); string storedProc = "GetData"; SqlCommand command = new SqlCommand(storedProc, connection); command.CommandType = CommandType.StoredProcedure; command.Parameters.Add(new SqlParameter("@EmployeeID", employeeID)); return (byte[])command.ExecuteScalar(); } finally { connection.Dispose(); } } catch (Exception) { }
Pengecualian akan tertangkap dalam pernyataan akhirnya dan koneksi ditutup. Pengecualian tidak akan terlihat oleh klausa tangkapan luar.
sumber
Saya menulis dua pernyataan menggunakan di dalam blok coba / tangkap dan saya bisa melihat pengecualian ditangkap dengan cara yang sama jika ditempatkan di dalam pernyataan menggunakan seperti contoh ShaneLS .
try { using (var con = new SqlConnection(@"Data Source=...")) { var cad = "INSERT INTO table VALUES (@r1,@r2,@r3)"; using (var insertCommand = new SqlCommand(cad, con)) { insertCommand.Parameters.AddWithValue("@r1", atxt); insertCommand.Parameters.AddWithValue("@r2", btxt); insertCommand.Parameters.AddWithValue("@r3", ctxt); con.Open(); insertCommand.ExecuteNonQuery(); } } } catch (Exception ex) { MessageBox.Show("Error: " + ex.Message, "UsingTest", MessageBoxButtons.OK, MessageBoxIcon.Error); }
Tidak peduli di mana mencoba / menangkap ditempatkan, pengecualian akan ditangkap tanpa masalah.
sumber