Cara terbersih untuk menggunakan BeginTransaction menggunakan coba tangkap

Jan 28 2021

Sampai sekarang saya menggunakan dua blok coba tangkap untuk kueri saya. Yang pertama akan memunculkan kesalahan jika koneksi tidak dibuat. Yang kedua memeriksa apakah SqlCommandberhasil 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

2 Charlieface Jan 28 2021 at 00:18

Tak satu pun dari kedua metode itu yang baik. Mereka terlalu bertele-tele.

Metode terbaik adalah dengan memasukkan Transactionin a usingjuga, 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 usingakan membersihkan semuanya.

Jika Anda perlu menangkap untuk menampilkan pesan kepada pengguna, lakukan di luar kode yaitu letakkan di try/catchsekitar semuanya. Jangan lakukan kode pembersihan sendiri