ASP.NET C# T-SQL ile İlgili İpuçları

Daha çok yeni başlayanların işine yarayacağını düşündüğüm bu yazıda sizlerle, gerek tasarım tarafında gerekse kod tarafında karşılaştığım sıkıntıların çözümlerini, teknik ve taktiklerini paylaşmaya çalışacağım.

  • Birden fazla DataReader kullanmak: Eğer aynı yerde iki adet DataReader nesnesi kullanmak isterseniz karşınıza, “Bu komut ile ilişkili, öncelikle kapatılması gereken açık bir DataReader zaten var.” gibisinden bir hatayla kaşılaşırsınız. Bunu önlemek için ConnectionString’ inize “MultipleActiveResultSets=true” ibaresini eklemelisiniz.
  • Nesnelere özellikler atamak: Örneğin bir tane asp:Label imiz var ve buna kod kısmından bir click yada bir style ataması yapacağız. Bunu yapabilmek için nesnelere Attributes özelliğinden yükleme yapabiliyoruz. Örneğin; Button1.Attributes.Add(“style”, “color:red”); veya Button1.Attributes.Add(“onclick”, “alert(‘deneme’)”); gibi.. Bunu bir kenara not alın çünki çoğu zaman çok işinize yarayacak bir özellik.
  • HTML etiketlerine kod tarafından erişip işlem yapmak: Mesela bir <table> yada <div> iniz var yani HTML ile oluşturduğunuz bir etiket, bunlara runat=”server” ve d=”herhangibirid” ifadelerini eklediğinizde kod tarafından erişip işlem yapabilirsiniz. Örneğin herhangibirid.Visible = false; deyip işlem sonunda o id ye sahip elemanı görünmez yapabilirsiniz. Yani ekstradan javascript kasmanıza gerek kalmaz. Yapabilecekleriniz sadece bu değil tabiki, içine içerik ekleyebilir style ayarlarını değişebilir kısacası desteklenen tüm özellikleri ayarlayabilirsiniz.
  • GridView Nesnesinin renklendirilmesi: Bahsettiğim olay şu, gridview de listeleme yaptığımızda bir satırın farklı diğer satırın farklı renkte olma olayı. Bunu kodla çözememizde mümkün fakat GridView’ in AlternatingRowStyle özelliği ile koda gerek kalmadan rahatça çözelbiliriz. Örnek Kullanım: <asp:GridView ID=”GridView1″ runat=”server”><AlternatingRowStyle BackColor=”Red” /></asp:GridView>
  • Bir işlemi yapmadan önce Eminmisiniz sorusunu javascript kullanarak sorma: İster GridView içinden bir kayıt silerken, ister bir kaydı güncellerken nerde kullanmak isterseniz kullanabileceğiniz bu işlemi, eğere nesnemizde OnClientClick özelliği varsa direk oraya OnClientClick=”return confirm(‘Bu Kategoriyi silmek istediğinizden emin misiniz?’);” yoksa yukarıda anlattığım Attributes şeklinde onclick olarak nesneye ekleyebilirsiniz. NesneId.Attributes.Add(“onclick”,”return confirm(‘Bu Kategoriyi silmek istediğinizden emin misiniz?’)”)
  • Sql sorgusunda Insert ile birlikte Select ifadesini bir arada kullanmak: Normal insert cümlemiz şu şekilde yazılıyor, Insert Into TabloAdi (Alan1,Alan2) Values (‘Değer1′,’Değer2’) anlaşılacağı üzere tablomuzdaki alanlara karşılık gelen değerleri tablomuza ekliyoruz. Diyelimki farklı bir tablodaki kayıtları istediğimiz koşula göre diğer tablomuza ekliyoruz. Hemen örneğimize bakalım; Insert Into VerilerinEklenecegiTablo (Alan1,Alan2,Alan3) Select tablo_alani1, tablo_alani2,'”+TextBox1.Text+”‘ From DigerTablo Where id=1 Gödüğünüz gibi koşullu bir şekilde farklı bir tablodan diğer tabloya kayıtlarımızı ekliyoruz, ekstra olarak dışardan bir verininde girilmesini istiyorsak ” arasına değişkenimizi yada değerimizi yazıyoruz.
  • Aynı anda ilişkili iki tabloya veri eklemek: Öncelikle olayımızı biraz açayım, diyelim veritabanımızdaki iki tabloya kayıt gireceğiz, ama bu tablolar bir birleriyle ilişkili. Yani; id | adsoyad | email —> Bu bizim birinci tablomuz adı Kullanici olsun id | kullanici_id | resimadi | tarih —> Buda bizim Kullanici tablosuyla ilişkili olan Resimler ablomuz olsun. Senaryomuza göre yeni bir kullanıcı kayıt olurken bir resim yüklüyor ve bu resimi biz Resimler tablomuza kayıt yapmak istiyoruz. İlk bakışta kolay gibi görünüyor fakat, ilk anda Kullanici tablosunda ilgili kullanıcıya ait bir kayıt olmadığından id değerinin ne geleceğini bilmiyoruz, yani Resimler tablosundaki kullanici_id yerine yazacağımız id belli değil. Bunu bir kaç değişik yoldan yapmak mümkün, fakat kullandığım yöntemlerin içinde en sağlıklı olanı SELECT IDENT_CURRENT(‘TabloAdi’)) şeklinde sorgulama yapıp gelecek olan id nin ne olduğunu bulmak. Örnek cümlemizin tamamına bakalım;
    Adım 1: Insert Into Resimler (kullanici_id,resimadi,tarih) Select Ident_Current(‘Kullanicilar’),’resminadi.jpg’,’01.01.2009′
    Adım 2:
    Insert Into Kullanicilar (adsoyad,email) values (‘abdullah’,’abdullah@xxx.com’)
    Bu şekildeki kullanımda milisaniye cinsinden aynı anda işlem yapılırsa sıkıntı olabilir, haricinde sıkıntı olması zor. Bu sıkıntıyıda  Transaction kullanarak aşabiliriz. Transaction kullanım örneğinide aşşağıda ayrı bir başlık halinde anlatmaya çalışacağım.
  • Transaction Nedir ve Kullanımı: Zaman zaman aynı anda birden fazla Insert veya Update işlemi yaptığımız oluyor. Bu cümlelerin büyük çoğunluğu zaman zaman birbiriyle ilişkili oluyor. Herhangi bir teknik hata veya farklı nedenlerden dolayı bir kopma olduğunda bütünlüğümüz boluzulur ve kayıtlarımızda ciddi sıkıntılar meydana çıkar. Bunu engellemek için Transaction denen mekanızmayı kullanıyoruz. Bu sayede herhangir bir hata durumunda işlemlerin hiçbiri gerçekleşmiyor, hata olmadığında ise hepsi birden gerçekleşiyor. Hemen bir örnekle Transaction kullanımı örnekleyeyim.
    SqlConnection conn = new SqlConnection(WebConfigurationManager.ConnectionStrings["baglanti"].ToString());// Sql bağlantımızı yapıyoruz.
    SqlCommand islem1 = new SqlCommand(“Insert Into TabloAdi_1 (alan1,alan2,alan3) Values (‘değer1′,’değer2′,’değer3′)”, conn);// 1. işlemimiz
    
    SqlCommand islem2 = new SqlCommand(“Insert Into TabloAdi_2 (alan1,alan2,alan3) Values (‘değer1′,’değer2′,’değer3′)”, conn);// 2. işlemimiz
    
    SqlCommand islem3 = new SqlCommand(“Insert Into TabloAdi_3 (alan1,alan2,alan3) Values (‘değer1′,’değer2′,’değer3′)”, conn); // 3.işlemimiz
    
    conn.Open(); // Bağlantımızı açıyoruz.
    SqlTransaction sqlTrans = conn.BeginTransaction(); // Transaction nesnemizi tanımlıyoruz.
    
    // Transaction nesnesine işlemleri eşitliyoruz.
    islem1.Transaction = sqlTrans ;
    islem2.Transaction = sqlTrans ;
    islem3.Transaction = sqlTrans ;
    //Burda try cath bloğunu kullarak hata olmadığında ve olduğunda yapılacak işlemleri belirtiyoruz.
    try
    { // eğer hata yoksa try bloğunun içi çalışır !
    islem1.ExecuteNonQuery();
    islem2.ExecuteNonQuery();
    islem3.ExecuteNonQuery();
    sqlTrans.Commit(); // hiç bir problem oluşmamışsa işlemlerimiz yapılıyor.
    }
    catch (Exception hata)
    { // eğer bir hata olmuşsa catch bloğu çalışır !
    Response.Write(“İşleminiz yapılamadı, Oluşan Hatanın Detayı<br />”+hata);
    sqlTrans.Rollback(); // herhangi bir sebepten dolayı hata oluşmuşsa işlemlerimiz geri alınıyor yani yapılmıyor.
    }
    finally
    { // hata olsun olmasın finally bloğunun içi çalışır ! burda nesneleri sonlandırıyoruz.
    conn.Close();
    conn.Dispose();
    sqlTrans.Dispose();
    islem1.Dispose();
    islem2.Dispose();
    islem3.Dispose();
    }
    

    Umarım faydalı olur, zaman zaman günlerce üzerinde uğraştığım, saç baş yonduğum konuları sizlerle tecrüblerim dahilinde paylaşmaya çalıştım. Eğer hatalı bir yer görürseniz lütfen yorum olarak ekleyin, gerekli düzeltmeleri yapayım. Öğrendikçe bu tarz paylaşımlarıma devam edeceğim, kalın sağlıcakla.

  • yns.emre

    ellerine sağlık kardeşim güzel bi çalışma olmuş

  • apoStyLEE

    Teşekkür ederim kardeşim, beni sizler varettiniz. Tekrardan teşekkürler.

  • Fedai Gören

    Transaction olayı hayat kurtarıcı. teşekkürler.

  • http://hasangezer.com Hasan Gezer

    Teşekkürler.

  • ender demir

    bu uzun zamandır aradıgım en guzel makale sql insert konusunda deneyimlerinizden yararlanmak isterim adresim sizde var.. yardımcı oldugunuz icin tesekkurler…

  • http://hjk apoStyLEE

    Herkese teşekkür ederim. Fırsat buldukça bu tarz bilgileri paylaşmaya çalışıyorum yardımcı oluyorsam ne mutlu bana :)

  • designerx

    kaç gündür arıyorum sonunda en azından nasıl yapabileceğime dair bir yazı bulabildim eline koluna ve yüreğine sağlık. bu konuda senden bir yazı daha bekliyor olacağım.

  • ertuğrul

    transaction olayını bir kaç tabloya aynı anda kaydeden bir form üzerinde gösterebilir misiniz? MS SQL kullanıyorum ama yapamadım

  • http://hexaturk.blogspot.com Ali Emrah PEKESEN

    Öncelikle Ellerinize Sağlık..

    Emek vermiş oturup yazmışsınız.

    Alıntı olduğunu belirterek paylaşıyorum..

    İyi Çalışmalar..

    • apoStyLEE

      Teşekkür ederim.

  • mehmet cengiz

    çok güzel bir çalışma olmuş. bir haftadır bir çok yerde aradım “emin misiniz?” kontrolünü sonunda buldum. teşekkür ederim, bu güzel çalışmaların devamını beklerim.

  • http://Websitesi Önder

    “en sağlıklı olanı SELECT IDENT_CURRENT(‘TabloAdi’)) şeklinde sorgulama yapıp gelecek olan id nin ne olduğunu bulmak” demissiniz fakat bu yontem cok sagliksiz ve kullanilmamasi gereken bir yontemdir.Gelecek olan idyi bulmak yerine scope_identity ile ilk insertte olusan idyi yakalayip diger tabloya bu degerin girilmesi(transaction dahilinde) daha saglikli olacaktir.
    Makale gayet guzel olmus elinize saglik.

    • apoStyLEE

      Bilgilendirme için teşekkür ederim. IDENT_CURRENT kullanımının ne gibi sakıncaları olabilir ? Açıklarsanız sevinirim.

  • cem sincap

    sqltransaction kullanarak kayıtları ekledikten sonra sqlTrans.Commit(); altına response.redirect(“?id=”+ Session[“ID”]”); yani yönlendirme yaptığımda çalışmıyor şu hatayı alıyorum neden ? SQLTransaction complete; is no longer available.