Try catch kullanarak BeginTransaction'ı kullanmanın en temiz yolu
Ş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
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