Stored Procedure'ler İle Neleri Yapmak Caizdir?

Yazar: Memik YANIK
Kategori: ADO.NET & Entity Framework
Eklenme Tarihi: 12.5.2009 18:47:59



Bu makalede C# uygulamaları dahilinde Stored Procedure'ler ile tablolara nasıl kayıt eklendiğinden söz edilmektedir.

Bilirsiniz; veritabanı işlemleri genellikle 2 grubu ayrılmaktadır. 1. gruba giren işlemlerde veritabanı, tablo ve indeksler hazırlanır, sonradan mevcut tabloların yapılarında değişiklikler yapılır ve gerek duyulmayan tablolar silinir vs. İkinci grup işlemlerde ise veritabanındaki mevcut tablolara bilgi girilir, mevcut bilgiler sorgulanır, istenenler değiştirilir. Bu işlemler bazen yardımcı programlar ile yapılır. Örneğin Visual Studio’nun Server Explorer penceresi kısıtlı özelliklere sahip bir veritabanı programı gibidir. Server Explorer penceresinden yararlanıp SQL Server veritabanı hazırlayıp bu tablolara bilgi girmek mümkündür.

İster yeni veritabanı hazırlansın, ister mevcut tablolara bilgi girilsin her seferinde geri planda SQL kodu işletilir. Bir çok programlama dillinde olduğu gibi C# uygulamaları dahilinde veritabanı işlemleri yapmak üzere SQL kodları Command nesneleri aracılığı ile işletilir. Ancak bazen programcılar Command nesnesi aracılığı işlettikleri SQL kodlarını daha sonra tekrar kullanabilmek için veritabanın içinde saklarlar. Veritabanı içinde saklanmak istenen SQL kodları genellikle Stored Procedure olarak değerlendirilmektedir. Bu durumda veritabanındaki bir tabloya kayıt eklerken, silerken veya mevcut kayıtları sorgularken gerek duyacağınız SQL kodu daha önce Stored Procedure olarak veritabanına kaydedildiyse yeni baştan SQL kodu yazmaya gerek kalmadan işletebiliyorsunuz. MySQL gibi bazı veritabanları Stored Procedure'leri yakın bir zamanda desteklemeye başlamakla birlikte benim bildiğim en az 15 yıldır sunucu veritabanları Stored Procedure desteğini veriyorlar.

Buna rağmen 2004 yılında yayınlanan ilk C# kitabımda Stored Procedure’ler ile veritabanına nasıl kayıt girilip okunduğunu anlatınca birileri çıkıp Memik Yanık bu konuyu kitabında anlatmakla buluşumu izinsiz kullanmıştır dedi. Bunu söyleyene kalırsa Stored Procedure’ler kendi icatlarıydı, kendilerinden başka kimse Stored Procedure’lerden haberdar olamazdı. Aslında 2004 yılında C# kitabımda Stored Procedure’lerle ilgili sayfaları hazırlarken daha önce yayınlanan .NET uyumlu Visual Basic kitabım için yazdıklarımı küçük değişikliklerle C#’a uyarlamakla yetinmiştim.

Hem Memik Yanık’ın Stored Procedure’leri C# uygulaması dahilinde nasıl kullanıldığını anlatmasının sıradan bir işlem olduğunu kanıtlamak hem de C# uygulamaları dahilinde Stored Procedure’lerin nasıl kullanıldığını henüz bilmeyenleri düşünerek bu konudan biraz söz edeceğim. Bu amaçla Visual Studio’nun Server Explorer penceresinden yararlanarak önce bir veritabanı, ardından bir tablo hazırladım. Veritabanına ve tabloya ad seçerken(!) 2 yıl kadar önce yayınlanmasına rağmen değişken, nesne, veritabanı veya tablo adı benzerliğinden dolayı henüz suçlanmadığım ADO.NET kitabımdan yararlandım.

Hazırladığım tablo "Firma", "Adres", "Telefon" ve "Sehir" adında 4 alana sahiptir. "Firmalar" adını verdiğim tabloyu hazırladıktan sonra yine Visual Studio'nun Server Explorer penceresinden yararlanıp aşağıdaki gibi "Kayit_ekle" adında bir Stored Procedure hazırladım. Sizler procedure adı benzerliğiyle suçlanmak istemiyorsanız "Kayit_ekle" yerine "Kayit_insert" veya "Bir_zahmet_ekle_kardes" gibi bir adı kullanabilirsiniz.

Bildiğiniz gibi Stored Procedure’ler SQL dilinin CREATE PROCEDURE deyimi ile hazırlanmaktadır. Daha önce hazırlanan Stored Projedure’de değişiklik yapılmak istendiğinde ise ALTER PROCEDURE deyimini kullanmak gerekmektedir. Aşağıda verdiğim ekran görüntüsünü Stored Procedure hazırladıktan sonra aldığım için CREATE PROCEDURE deyimi yerini ALTER PROCEDURE deyimine bıraktı.



Az çok SQL kodu yazmış olanların malumu olduğu üzere mevcut tablolardan birisine kayıt girilmek istendiğinde SQL dilinin INSERT INTO deyiminden yararlanılmaktadır. "Kayit_ekle" adını verdiğim bu Stored Procedure ile 4 alana sahip tabloya kayıt girmek istediğim için 4 parametre hazırladım. Bu parametreler dışarıdan bilgi aldıkları, başka bir deyişle dışarıya bilgi göndermedikleri için hepsinin yönü Input’tur. Bildiğiniz gibi yönü Input olan parametrelerin yönünü belirtmeye gerek yoktur.

Stored Procedure hazırlayıp veritabanına kaydettikten sonra Visual Studio ile bir C# projesi hazırlayıp projenin formuna SqlConnection ve SqlCommand nesnelerini yerleştirdim. Çünkü konu SQL Server veritabanları olduğunda Stored Proecure’ler SqlCommand nesneleri ile işletilmektedir.

Bu SqlConnection nesnesi ile “Firmalar” adını verdiğim tabloyu içeren SQL veritabanına bağlanmak istediğim için Properties penceresinde SqlConnection nesnesinin ConnectionString özelliğinde gerekli ayarlamaları yaptım.

Tahmin edileceği gibi SqlCommand nesnesi ile işletilmesi istenen SQL kodlarını tasarım anında Properties penceresinde veya kod yazarak CommandText özelliğine aktarmak gerekiyor. SqlCommand nesnesi sayesinde işletilmesini istediğiniz SQL kodunu daha önce bir Stored Procedure olarak düzenlediğim için SqlCommand nesnesinin CommandType özelliğinde değişiklik yapmam gerekiyor. CommandType özelliği başlangıçta Text bilgisini içeriği için CommandText özelliğine SQL kodları aktarılmaktadır. Bu nedenle Properties penceresinden yararlanıp SqlCommand nesnesinin CommandType özelliğini StoredProcedure olarak ayarladım.



SqlCommand nesnesi sayesinde işletilecek SQL kodunun yeri konusunda bu şekilde ayarlama yaptıktan sonra CommandText özelliğine ilgili Stored Procedure’nin adını aktarabilirsiniz.



Bu sırada SqlCommand nesnesinin Connection özelliğini ayarladıysanız ilgili SqlConnection nesnesi ile bağlanılan veritabanındaki Stored Procedure’ler Properties penceresinde listelenir. Yukarıda “Kayit_ekle” adında bir Stored Procedure hazırladığım için bu Stored Procedure’nin adını yazdım.

Yukarıda anlatılan şekilde forma SqlConnection ve SqlCommand nesnelerini yerleştirip SqlCommand nesnesinin Connection, CommandText ve CommandType özelliklerini ayarladıktan sonra forma bir düğme ve 4 TextBox yerleştirip aşağıda verdiğim kodu yazdım.

private void Ekle_Click(object sender, EventArgs e)
{
    SqlParameter Par1 = new SqlParameter("@Par_firma", SqlDbType.Char, 20);
    SqlParameter Par2 = new SqlParameter("@Par_adres", SqlDbType.Char, 35);
    
SqlParameter Par3 = new SqlParameter("@Par_telefon", SqlDbType.Char, 15);
    
SqlParameter Par4 = new SqlParameter("@Par_sehir", SqlDbType.Char, 10);
    sqlCommand1.Parameters.Add(Par1);
    
sqlCommand1.Parameters.Add(Par2);
    
sqlCommand1.Parameters.Add(Par3);
    
sqlCommand1.Parameters.Add(Par4);
    
sqlCommand1.Connection = sqlConnection1;
    
Par1.Value = textBox1.Text;
    
Par2.Value = textBox2.Text;
    
Par3.Value = textBox3.Text;
    
Par4.Value = textBox4.Text;
    sqlConnection1.Open();
    
sqlCommand1.ExecuteNonQuery();
    
sqlCommand1.Parameters.Remove(Par1);
    
sqlCommand1.Parameters.Remove(Par2);
    
sqlCommand1.Parameters.Remove(Par3);
    
sqlCommand1.Parameters.Remove(Par4);
}

Bu kod sayesinde TextBox’lara yazılanlar tabloya yeni bir kayıt olarak kaydedilecektir. Bu kodda ilk olarak Stored Procedure’de tanımladığım parametreler ile aynı özelliğe sahip 4 Sqlparameter nesnesi hazırladım. Bütün parametrelerin yönü Input olduğu için Direction özelliğini ayarlamaya gerek duymadım. SqlParameter nesnelerini hazırlayıp SqlCommand nesnesinin Parameters koleksiyonuna ekledikten sonra formdaki TextBox’ların içeriklerini parametrelerin Value özelliklerine aktardım. En son olarak adını SqlCommand nesnesinin CommandText özelliğine aktardığım Stored Procedure’u ExecuteNonQuery() metoduyla işlettim.

Stored Procedure’ler hakkında 30-40 sayfa uzunlukta bir makale hazırlamak mümkün olsa şimdilik burada kesiyorum. Daha sonra Stored Procedure ile yapılması suç olan ve olmayan diğer işlemleri anlatacağız. 3 sayfa boyunca yazdıklarımı okuyanlara birkaç soru sormak isterim:

  • Sizce burada Stored Procedure’ler hakkında yazdıklarım çok mu orijinal ya da benzeri bilgilerin başka kaynaklarda bulunma ihtimali yok mudur?

  • Stored Projedure’ler sayesinde tablolara bu şekilde kayıt girmek sizce yerli bir yazarın 2004 yılında yaptığı bir buluş mudur?

  • SQL Server, .NET Framework ve C# programlama dilini hazırlayan Microsoft firmasının programcılarının Stored Procedure’lerin tablolara kayıt girişinde kullanılabileceği konusunda haberleri var mıdır?

  • Bugüne kadar .NET Framework uyumlu herhangi bir programlama dillini kullanıp uygulama geliştiren programcılar Stored Procedure’ler ile tablolara bu şekilde kayıt girdiklerinde sizce suç mu işlemiş oldular?


Memik YANIK

Buradaki arkadaşlara göre yaşlı sayılırım; ilk masaüstü bilgisayarım 3000$'a aldığım 386sx-16 işlemciliydi. 1 MB belleği ve 40 MB diski vardı. Sonra 12 Mhz hızında 286 işlemcili Laptop bilgisayar edindim. Ağırlığı 7-8 kilo kadardı. İlk kitabım Clipper 5.2'yi bu bilgisayarda yazdım. Bu kitap 1994 yılında yayınlandı. İlk makelem 1992 yılında Bilgisayar Pazarı dergisinde yayınlandı. Devamında Pc World dergisinde 1 yıl kadar her ay yazılar yazdım. Sizinle asıl paylaşmak istediğim konu şudur: Değişken adı benzerliğinden dolayı, başka bir deyişle kitaplarımda verdiğim kısacak örneklerde sayi, i, j, dosya gibi değişkenlere yer verdiğim için yargılanmaya devam ediyorum.
Bu makaleye ilk yorum yapan siz olun.

Yorumunuz