Try catch kullanarak BeginTransaction'ı kullanmanın en temiz yolu

Jan 27 2021

Şimdiye kadar sorgularım için iki try catch bloğu kullanıyorum. Birincisi, bağlantı kurulmazsa bir hata atar. İkincisi SqlCommand, başarıyla uygulanıp uygulanmadığını kontrol eder . Aşağıdaki örnek gibi

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
{

}

Benim için daha net görünen ikinci bir Örnek buldum.

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{}
   }
 }
}

İkisi de aynı sonucu mu veriyor? Hangisi daha çok tercih edilir?

Yanıtlar

2 Charlieface Jan 28 2021 at 00:18

Bu iki yöntemden hiçbiri iyi değil. Çok ayrıntılılar.

En iyi yöntem sadece koymaktır Transactionbir de usingayrıca sorgu için bir parametre kullanmak gerekir, hem de:

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();
    }
}

Kaynak koduna bakarak, işlem nesnesini elden çıkarmanın, henüz taahhüt edilmemişse otomatik olarak geri döneceğini görebiliriz . Yani usingher şeyi temizleyeceğiz.

Kullanıcıya bir mesaj görüntülemeyi yakalamanız gerekiyorsa, bunu kodun dışında yapın , yani try/catchher şeyin etrafına bir tane koyun . Temizleme kodunu kendiniz yapmayın