C# ile Stored Procedure Kullanımı 1927319273 okunma
C# üzerinde Stored Procedure kullanımı birkaç paremetreyle gerçekleşebilecek bir olaydır. Önemli olan uygulamanın türüdür. Örneğin procedure’de neler yaptıracağınızı uygulamanız belirler. Procedure kullanmanın yararlarını daha önceden bahsetmiştim, kısaca değinmek gerekirse, hızlı ve güvenli olduğundan kullanılıyor. Dışarıdan gelen paremetreleri string olarak algıladığı için koda aktarmıyor, onun için o paremetre yalnızca bir stringdir. Ancak bunun tam tersi olursa yani procedure kullanılmazsa SQL Injection kurbanı olabilirsiniz.
Kullanımına gelirsek, öncelikle Visual Studio içerisinde Windows Form Application projesi oluşturarak birkaç nesneden küçük bir uygulama oluşturalım, basit olması açısından pek de detaya girmeyeceğim.
Not: Stored Procedure hakkında uygulamaları forum içerisinde bağlantı verilecektir.
Yapacağımız uygulamada, kişi adını, soyadını ve memleketini seçip kaydet butonuna bastığında procedure yöntemiyle veritabanına kaydettireceğiz. Basit bir uygulama.
Öncelik olarak aşağıdaki uygulama penceresini oluşturalım.
Gereken nesneler:
- 2 adet textbox
- 3 adet label (isim yazmak için)
- 1 adet combobox
- 1 adet button
Label hariç diğer nesnelerin id’lerini (name kısmını) şu şekilde yapalım (isteğe bağlı): TxtAdi, TxtSoyadi, CmbMemleketi, BtnKaydet.
Eğer sizler de bu şekilde yaparsanız işinizi daha rahat olur.
Oluşturduğumuz uygulama penceresinde şimdilik işimiz yok. Veritabanı tarafına geçelim. SQL Server’da oluşturmuş olduğum iki adet tablo var, aşağıdaki tablolar uygulamamıza örnek olacaktır. Birincisi Kisiler, ikincisi Iller. Kisiler tablosuna kişi bilgileri, iller tablosuna ise illerimizden birkaç örnek yazacağız. Oluşturduğumuz Iller tablosuna birkaç il girin. Buradaki amaç ise veritabanından veri çekerek combobox’ı doldurmaktır, bunu kişiler tablosunda da yapabilirdik, bir problemin birden fazla çözümü olabilir neticede.
Şimdi New Query diyelim ve Stored Procedure oluşturalım. Procedure kodları aşağıdaki gibi olacaktır tabloya göre:
create proc spKisiEkle
(
@kisiId int output,
@kisiAdi nvarchar(30),
@kisiSoyadi nvarchar(30),
@kisiMemleketi nvarchar (20)
)
as
insert into dbo.Kisiler (adi, soyadi, memleket) values (@kisiAdi, @kisiSoyadi, @kisiMemleketi)
Select @kisiId = @@IDENTITY
Stored Procedure oluşturuldu, aşağıdaki gibi.
Visual Studio’da uygulama penceremizi açalım, kodları yazmaya başlayalım. Önce veritabanı işlemleri için kütüphanemizi çağıralım ve veritabanına bağlantı cümlemizi yazalım.
Örnek bir connectionstring:
SqlConnection Baglantim = new SqlConnection("Data Source=RSERIT;Initial Catalog=ProcedureDb;Integrated Security=True");
Örnek bir diğer connectionstring (sa kullanıcısıyla oturum açılmışsa):
SqlConnection Baglantim = new SqlConnection("Server=localhost;Database=ProcedureDb;uid=sa;pwd=1");
Not: Connection String'i public form1() üzerine yazmamın sebebi her yerden erişebilmek içindir. Bu arada, değişik türlerde connectin string yazımı olduğu için farklı şekilde de girebilirim.
Şimdi MemleketDoldur isimli bir fonksiyon oluşturalım, bunun içerisine de ComboBox’ı dolduracak kodları girelim. Tabi ki bunları try-catch-finally bloklarıyla yapacağız.
private void MemleketDoldur()
{
try
{
Baglantim.Open(); // bağlantımızı açtık
SqlCommand Com = new SqlCommand("Select ilAdi from Iller", Baglantim); // SqlCommand ile SQL Sorgumuzu çalıştırıyoruz
SqlDataReader drMemleket = Com.ExecuteReader(); //SqlDataReader ile verilerimizi okutturacağız
while (drMemleket.Read()) // DataReader ile oluşturduğumuz veriyi while döngüsüne koyuyoruz, döngü bize illeri listeleyecektir
{
CmbMemleket.Items.Add(drMemleket["ilAdi"]); // ilAdi isimli sütünumuzu CmbMemleket isimli ComboBox nesnesine ekliyoruz, buradan verileri çekecek
}
drMemleket.Close(); // veri okuma işi bitince close diyerek kapatılır
}
catch
{
}
finally
{
Baglantim.Close(); // açtığımız bağlantıyı kapattık.
}
Bu şekilde kod bloğunu oluşturmuş olduk.
Biz Kaydet butonuna bastığımızda veritabanına kayıt yapacağız, o halde Stored Procedure paremetrelerini de buradan çağıracağız. Yani şimdiki kodlarımızı button click içerisine yazacağız. Form kısmına gelelim, butona çift tıklayalım.
Kodlarımızı yine try-catch-finally blokları içerisine yazacağız. Başta bağlantımızı açacağız, ardından SqlCommand ile sorgu değil de oluşturduğumuz procedure ismini yazacağız (zaten procedure’de sorgu yazıyor), CommandType ile komut türümüzü belirteceğiz (stored procedure).
try
{
Baglantim.Open();
SqlCommand Comm = new SqlCommand("spKisiEkle", Baglantim); //Burada SQL'de oluşturduğumuz procedureun adını yazıyoruz
Comm.CommandType = CommandType.StoredProcedure; //Burada procedure oluşturuyoruz
}
Bu küçük bir kod satırı oldu. Şimdi işi paremetrelere dökelim. Oluşturduğumuz Stored Procedure’de kaç tane paremetre oluşturmuştuk? 4 tane. id’yi yazdık ancak o rol olarak orada, o otomatik olarak sayı alıyor. Şimdi id sütunu ile başlayalım, ardından ad, soyad ve memlekete de girelim.
try
{
Baglantim.Open();
SqlCommand Comm = new SqlCommand("spKisiEkle", Baglantim); //Burada SQL'de oluşturduğumuz procedureun adını yazıyoruz
Comm.CommandType = CommandType.StoredProcedure; //Burada procedure oluşturuyoruz
//PAREMETRELER -- Parametreler aşağıdaki gibi oluşturuluyor
//id sütunu için paremeter
SqlParameter id = new SqlParameter("@kisiId", SqlDbType.Int); // SqlParameter ile paremetremizi yazıp veri türünü belirtiyoruz
id.Direction = ParameterDirection.Output; // eğer veri gönderilecekse Input, gönderilmeyecekse Output yapılır. Id sütununa veri göndermeyeceğiz, o zaten otomatik olarak numara alıyor (identity specification özelliğiyle)
Comm.Parameters.Add(id); // paremetremize id’yi ekliyoruz
//ad sütunu için parameter
SqlParameter adi = new SqlParameter("@kisiAdi", SqlDbType.NVarChar, 30);
adi.Direction = ParameterDirection.Input; //veri olarak gönderileceğinden dolayı Input diyoruz
adi.Value = TxtAdi.Text; // burada oluşturduğumuz adi paremetresini TxtAdi isimli TextBox’a bağlıyoruz
Comm.Parameters.Add(adi); // burada ise ekliyoruz
//soyad sütunu için parameter
SqlParameter soyadi = new SqlParameter("@kisiSoyadi", SqlDbType.NVarChar, 30);
soyadi.Direction = ParameterDirection.Input;
soyadi.Value = TxtSoyadi.Text;
Comm.Parameters.Add(soyadi);
//memleket sütunu için parameter
SqlParameter memleket = new SqlParameter("@kisiMemleketi", SqlDbType.NVarChar, 20);
memleket.Direction = ParameterDirection.Input;
memleket.Value = CmbMemleket.Text;
Comm.Parameters.Add(memleket);
Comm.ExecuteNonQuery(); // ExecuteNonQuery ile çalıştırıyoruz, geri değer döndürmeyeceği için (veritabanı kaydı var) NonQuery kullanıyorduk hatırlayalım
}
Paremetreleri yazdık, iş artık çalıştırmaya kaldı.
Şimdi form’a gelelim ve form’a çift tıklayıp, form load kısmına oluşturduğumuz kod bloğu adını ekleyelim. Hatırlarsak ismi MemleketDoldur() olarak geçiyor. Bu bloğun çalışması için load kısmına eklememiz şarttır.
Şimdi projemizi kaydedelim ve F5’e basarak projemizi çalıştıralım. Bilgileri girip kaydet butonuna bastım.
Kaydet butonuna basınca bunu veritabanında Kisiler tablosuna yazması gerekiyordu. Yazmış mı?
Başarıyla kodlar çalışmış ve veritabanına belirtmiş olduğum bilgiler yazılmış.
Görüldüğü gibi C# üzerinde Stored Procedure ile veritabanında işlemler yaptık. Bu en basitlerinden biriydi. Başında da belirttiğim gibi, işlemleri en basite indirgediğim için işlemler uzun gözüküyor, yoksa iş oldukça basit.
Bu uygulamanın normalde hazırlanış süresi en fazla 4-5 dakikadır.
Bu makaleden faydalanarak uygulama üzerinde çalışırsanız C# ile birçok işlevlerde bulunabilirsiniz.
Herhangi bir sorununuz olduğunda konuyu BilişimLife Forumu içerisinde Programlama kategorisine başlık açarak probleminizi bildirebilirsiniz.
Kolay gelsin.
Recep ŞERIT
BİR YORUM YAZIN