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.