C# ta Stored Procedure Kullanmak
Tekrar merhaba. Önceki makalemde stored procedureler hakkinda bir giris bilgisi vermistim ve genel olarak nasil yazildigina dair örnekler yapmistik. Bu makalemde stored procedurelerin c#’ta kullanilmasi ile ilgili biraz bilgi verecegim. Önceki makaleye buradan ulasabilirsiniz.
Bildiginiz gibi normal bir c# uygulamasi yaptiginizda sql’le baglanti kurmak için bir SqlConnection nesnesi, bir SqlCommand nesnesi ve duruma göre SqlDataReader veya AqlDataAdapter nesneleri kullaniriz. Bunda da ayni nesneleri kullanacagiz. Fakat tek farklilik sqlcommand nesnesinde olacak. Daha önceki makalemizde kullandigimiz;
SqlCommand mycommand = new SqlCommand();
mycommand.CommandType = CommandType.Text;
satirini
SqlCommand mycommand = new SqlCommand();
mycommand.CommandType = CommandType.StoredProcedure;
olarak degistiriyoruz.
Bir de; mycommand.CommandText = kismina çift tirnak içinde storedprocedure’ümüzün adini yaziyoruz. Örnegin:
mycommand.CommandText = "sp_Deneme_Ekle";
Daha sonra da procedure’ümüzün aldigi nesneleri gönderiyoruz. Simdi bunu daha açiklayici anlatabilmek için bir örnek yapmak istiyorum. Öncelikle bir procedure olusturalim:
CREATE PROCEDURE sp_Deneme_Ekle (@AD NVARCHAR(20),@SOYAD NVARCHAR(20))
AS
INSERT INTO DENEME_TABLO(AD,SOYAD) VALUES(@AD,@SOYAD)
GO
Görüldügü gibi procedure’ümüz iki tane deger aliyor (ad ve soyad) ve bunlari DENEME_TABLO isimli tablonun AD ve SOYAD sütunlarina ekliyor. Simdiki asama C#’ta bu storedprocdure’ü kullanmak için gerekli baglantilari yapmak. Bu baglantilari da bir metot içinde kullanmak istiyorum.
public void KAYIT(string ad, string soyad)
{
SqlConnection mycon = new SqlConnection();
SqlCommand mycommand = new SqlCommand();
mycommand.Connection = mycon;
mycon.ConnectionString = "";//connectionstring buraya yazilmalidir
mycon.Open();
mycommand.CommandText = "sp_Deneme_Ekle";
mycommand.CommandType = CommandType.StoredProcedure;
mycommand.Parameters.Add("@AD", SqlDbType.NVarChar, 50);
mycommand.Parameters["@AD"].Value = ad;
mycommand.Parameters.Add("@SOYAD", SqlDbType.NVarChar, 50);
mycommand.Parameters["@SOYAD"].Value = soyad;
mycommand.ExecuteNonQuery();
mycon.Close();
}
Gördügünüz gibi KAYIT metodu veritabanindaki sp_Deneme_Ekle isimli procedure’ü kullaniyor, ad ve soyad isminde iki tane string parametre aliyor ve geriye deger döndürmüyor.
mycommand.Parameters.Add("@AD", SqlDbType.NVarChar, 50);
mycommand.Parameters["@AD"].Value = ad;
satirlari procedure’ümüze parametre göndermek için kullanilir. SqlDbType yazdiktan sonra nokta koyunca sql’deki parametre tiplerini hepsi görünmektedir(int,datetime gibi). Simdi burada dikkat etmemiz gereken bir kaç husus var.
1. StoredProcedure’de nesneleri hangi siraya göre yazdiysak (yani bizim örnek için önce ad sonra soyad) C#’tan da o siraya göre tanitmaliyiz. Yani önce soyad sonra ad parametrelerini gönderemeyiz.
2. Veritabaninda parametrelerin önüne @ isareti koydugumuz için C#’ta da parametreleri göndermek için @ isareti kullanmamiz gerekir: “@AD"gibi
3. Parametrelerdeki büyük küçük harf farkliligina dikkat etmeliyiz. Yani procedure’de @AD olarak tanittigimiz parametreyi C#’ta @ad olarak gösteremeyiz.
Su ana kadarki kisimda veritabanimizda olusturdugumuz bir procedure’e nasil ulasacagimiz gördük. Simdi eger bu procedure deger döndürüyorsa nasil kullanacagiz? Önceki makalemde stored procedure’lerin nasil deger döndürdügünü ve niçin buna ihtiyaç duyuldugunu anlatmistim. Simdi bununla ilgili bir örnek yapalim:
Önce procedure’ümüzü biraz degistirelim. Ayni ad ve soyadda baska biri varsa kayit yapmasin ve geriye 0 degeri döndürsün. Eger yoksa kayit yapsin ve bize 1 degeri döndürsün.
CREATE PROCEDURE sp_Deneme_Ekle (@AD NVARCHAR(20),@SOYAD NVARCHAR(20))
AS
Declare @kayitkontrol int
Declare @SONUC int
Set @kayitkontrol=select count(*) from DENEME_TABLO where AD=@AD and SOYAD = @SOYAD
if(@kayitkontrol = 0)
begin
INSERT INTO DENEME_TABLO(AD,SOYAD) VALUES(@AD,@SOYAD)
set @SONUC = 1
end
else
begin
set @SONUC =0
end
return @SONUC
GO
Siradaki asama C#’ta bu procedure’ü kullanmak. Önceki örnekteki metotu bu procedure’e uygun olarak degistirecegiz ve dönüs degerini int olarak belirleyecegiz.
public int KAYIT(string ad, string soyad)
{
int sonuc;
SqlConnection mycon = new SqlConnection();
SqlCommand mycommand = new SqlCommand();
mycommand.Connection = mycon;
mycon.ConnectionString = "";//connectionstring buraya yazilmalidir
mycon.Open();
mycommand.CommandText = "DENEME_EKLE";
mycommand.CommandType = CommandType.StoredProcedure;
mycommand.Parameters.Add("@AD",SqlDbType.NVarChar, 50);
mycommand.Parameters["@AD"].Value = ad;
mycommand.Parameters.Add("@SOYAD", SqlDbType.NVarChar, 50);
mycommand.Parameters["@SOYAD"].Value = soyad;
mycommand.Parameters.Add("@SONUC", SqlDbType.Int);
mycommand.Parameters["@SONUC"].Direction = ParameterDirection.ReturnValue;
mycommand.ExecuteNonQuery();
sonuc = Convert.ToInt32(mycommand.Parameters["@KONTROL"].Value);
mycon.Close();
return sonuc;
}
görüldügü üzere sadece
mycommand.Parameters.Add("@SONUC", SqlDbType.Int);
mycommand.Parameters["@SONUC"].Direction = ParameterDirection.ReturnValue;
ve
sonuc = Convert.ToInt32(mycommand.Parameters["@SONUC"].Value);
satirlarini ekledik ve geri dönüs degerini almis olduk.
Umarim bu makale bilgilendirici olmustur. Bir sonraki makalede görüsmek üzere.
[QUOTE=vedat]arkadaslar sizden bir konuda yardim isteyecem proje ödevim için bir txt dosyasindan sql veri tablosuna veri atmam gerekiyor ama bunu nasil yapacagimi bilmiyorum çok ugrastim yapamiyorum yardim edebilecek olan varmi projeyi c# ta yaziyorum txt dosyasinin içerigi su sekilde küçük bir kismini atiyorum
[/QUOTE]
arkadaslar sizden bir konuda yardim isteyecem proje ödevim için bir txt dosyasindan sql veri tablosuna veri atmam gerekiyor ama bunu nasil yapacagimi bilmiyorum çok ugrastim yapamiyorum yardim edebilecek olan varmi projeyi c# ta yaziyorum txt dosyasinin içerigi su sekilde küçük bir kismini atiyorum
peki inner joyn kullanylan bir listeleme stored prosedürünü nasyl çagyrabilirim
🙂
valla uzun uzun baktym bir hata bulamamystym. araya i?ler girince sonra tekrar bakyyym dedim ama sen Allahtan farketmi?sin 🙂 yoksa bak dur 🙂
Hatamy buldum. Sorun yanly? stored procedure’u ça?yrmammy? 🙂
Maalesef bir de?i?iklik yok!
Set @kayitkontrol = SELECT count(*) FROM Firmalar WHERE Ad=@FirmaAdi
yerine
SELECT @kayitkontrol = count(1) FROM Firmalar WHERE Ad=@FirmaAdi
denermisin bir.
o zaman cevaplamanyz için bir soru daha.
super. kendy sorusunu kendy cevaplayan arkadaslary cok sevyyoruz 🙂
hatayy buldum
Selam,
Allah razi olsun bilgilendirmlere devam edin boyle lütfen yardimci olun ögrenme istegi olanlara
cokk tesekkurler stored proceduru ve calismaasini anlamak icin guzel bi calismaa , ellerinize saglik
Uyari için tesekkür ederiz. Hata düzeltildi
Merhaba sanirim 2 yerde geçen
sonuc = Convert.ToInt32(mycommand.Parameters[“@KONTROL”].Value);
ifadesindeki “KONTROL” yanlis olmus, “SONUC” olmali.
Çok tesekkür ederim güzel bir anlatim.Açikcasi çok faydalandim ve daha farkli seyler ögrendim,bilgime bilgi katti:)