19 Ağustos 2008 Salı

C#'ta Transaction işlemi

Veri tabanından bildiğimiz transaction işlemlerini C# üzerinde veriTabanı bağlantılı projelerimizde de kullanabiliyoruz.
İlk önce nedir bu transaction sen neden bahsediyon kardeşim diyen olur kısaca, veri tabanı üzerinde yaptığımız değişikliklerde bir hata oluşması durumunda veya oluşmaması durumunda :) size kalmış o anda yapılan değişikleri geri alabiliyorsunuz (rollback tran) veya yapılan değişikleri artık veri tabanında gerçek yerine kaydet diyebiliyorsunuz (commit). Çünkü yapılan işlemler ram üzerinde olur commit derseniz veri tabanında ilgili yerlerde güncelleme yapılır rollback derseniz güncelleme yapılmaz eski hali kalır.

sp_calisanSil stored procedure
create proc [dbo].[sp_calisanSil]
@calisanID int

AS

delete from siparisDetaylari where siparisID IN(select siparisID from siparisler where calisanID = @calisanID)

delete from siparisler where calisanID = @calisanID

delete from calisanMemleket where calisanID = @calisanID

delete from calisanlar where calisanID = @calisanID

[C# kodu]
SqlConnection con = new SqlConnection("Data source=.; Initial Catalog=Northwind;Integrated Security=SSPI;");
SqlCommand cmd = new SqlCommand("sp_calisanSil", con);

cmd.CommandType = CommandType.StoredProcedure;

con.Open();

SqlTransaction tr = con.BeginTransaction();

cmd.Transaction = tr;
cmd.Parameters.AddWithValue("@calisanID", int.Parse(txtCalisanID.Text));
try
{
cmd.ExecuteNonQuery();

tr.Commit();
}
catch (Exception ex) {
tr.Rollback();
MessageBox.Show(ex.Message);

}

finally {
if (con.State != ConnectionState.Closed)

con.Close();
}
Burada görüldüğü gibi bir çalışanı silmek için ilk önce siparisDetaylari, siparisler, calisanMemleket ve calisanlar tablosundaki silinmek istenen calisana ait bilgiler silinmelidir. Eğer bu sırayı yanlış yaparsak örneğin siparisDetaylari, calisanMemleket, siparisler, calisanlar diye siparisDetaylari ndaki veri silinir calisanMemleket teki veri silinmez ve sp bundan ileriye gitmez hata verir bu şekilde veri bütünlüğü bozulmuş olur. Bizim örneğimizde eğer bu şekilde hata olursa yapılan işlemler geri alınır (tr.Rollback()). Eğer hata oluşmazsa değişikler veri tabanı üzerine yazılır (tr.Commit())
Normal bağlantıdan farkı SqlTransaction nesnesi. Bu nesneyi, connection nesnesi ile transaction başlatıp eşitliyoruz, command nesnesinin transaction özelliğine transaction nesnesini veriyoruz ve gereken yerlerde commit ve rollback kullanıyoruz.

Hiç yorum yok: