Cara terbersih untuk menggunakan BeginTransaction menggunakan coba tangkap
Sampai sekarang saya menggunakan dua blok coba tangkap untuk kueri saya. Yang pertama akan memunculkan kesalahan jika koneksi tidak dibuat. Yang kedua memeriksa apakah SqlCommand
berhasil dijalankan. Seperti contoh dibawah ini
try
{
using(varconnection=newSqlConnection())
using(varcmd=newSqlCommand())
{
connection.Open();
var transaction=connection.BeginTransaction();
cmd.Connection=connection;
cmd.Transaction=transaction;
try
{
cmd.CommandText="InsertintoCustomers(Name)values('Dimitri')";
cmd.ExecuteNonQuery();
cmd.CommandText="InsertintoCustomers(Name)values('George')";
cmd.ExecuteNonQuery();
transaction.Commit();
}
catch
{
try{transaction.Rollback();}catch{}
}
}
}
catch
{
}
Saya menemukan Contoh kedua yang terlihat lebih jelas bagi saya.
SqlTransactiontransaction=null;
using(varconnection=newSqlConnection())
using(varcmd=newSqlCommand())
{
try
{
connection.Open();
transaction=connection.BeginTransaction();
cmd.Connection=connection;
cmd.Transaction=transaction;
cmd.CommandText="InsertintoCustomers(Name)values('Dimitri')";
cmd.ExecuteNonQuery();
cmd.CommandText="InsertintoCustomers(Name)values('George')";
cmd.ExecuteNonQuery();
transaction.Commit();
transaction.Dispose();
transaction=null;
}
catch
{
if(transaction!=null)
{
try{transaction.Rollback();}catch{}
}
}
}
Apakah keduanya memiliki hasil yang sama? Manakah dari dua yang lebih disukai?
Jawaban
Tak satu pun dari kedua metode itu yang baik. Mereka terlalu bertele-tele.
Metode terbaik adalah dengan memasukkan Transaction
in a using
juga, kita juga harus menggunakan parameter untuk kueri:
using(var connection = new SqlConnection(connString))
using(var cmd = new SqlCommand("Insert into Customers (Name) values (@Name));"))
{
var param = cmd.Parameters.Add("@Name", SqlDbType.VarChar, insert_column_length_here);
connection.Open();
using(var transaction = connection.BeginTransaction())
{
cmd.Transaction = transaction;
param.Value = "Dimitri";
cmd.ExecuteNonQuery();
param.Value = "George";
cmd.ExecuteNonQuery();
transaction.Commit();
}
}
Kita dapat melihat bahwa membuang objek transaksi akan secara otomatis melakukan rollback jika belum dilakukan, dengan melihat kode sumber . Jadi using
akan membersihkan semuanya.
Jika Anda perlu menangkap untuk menampilkan pesan kepada pengguna, lakukan di luar kode yaitu letakkan di try/catch
sekitar semuanya. Jangan lakukan kode pembersihan sendiri