none
Sored Procedure İç içe IF kullanımı ve Return Değeri Belirleme RRS feed

  • Soru

  • Merhaba Arkadaşlar,

    asp.net te yeni sayılırım, bir proje yapıyorum ve baya güzel olacak fakat bikaç yerde takıldım.

    iki adet tablom var. 1. tablom admin tablosu, ikinci tablom ise yetkiler tablosu. Bir stored procedure yazıyorum, bu proc da iç içe iki adet if kullanmam gerekiyor. Şöyle ki önce yetkiyi kontrol edeceğim yani asp.net te session dan gelen kullanıcının yetkisi var mı diye, varsa 2. şarta girmesini isyorum bu şartta ise kullanıcı adı sistemde var mı?

    mantığı şu şekilde kuruyorum.

    Create proc [dbo].[SP_AdminEkle]
    (
        @kullaniciadi varchar(50),
        @sifre varchar(50),
        @adsoyad varchar(50),
        @yetki int,
        @yetkiid int
    )
    as
    if exists (select * from yetki where @yetkiid = yetkiid and yetkiadi = 'admin')
    begin
        if exists(select * from admin where kullaniciadi = @kullaniciadi)
        begin
        return 2
        end
        
        else
        begin
        insert into admin (kullaniciadi,sifre,adsoyad,yetki) values (@kullaniciadi,@sifre,@adsoyad,@yetki)
        end
    end

    else
    begin
    return 0
    end

    amacım burada yetki doğruluğu olursa yani yetki = "admin" se derhal bi alt a inecek if e gelecek orda tabloda kullanıcıadı var mı yokmu bakacak eğer varsa return 2 dönderecek, yoksa else girecek orda insert yapacak. eğer yetki sorunu varsa zaten return 0 gönderecek. Yalnız ben bunu yaptım fakat 1. si sorguyu çalıştırınca exec diyerek

    Command(s) completed successfully. diyor ama eklemiyor.yani 0 yada 2 göndermiyor. bide bu şekilde yapınca ben ado.net tarafında şunu yapabilrmiyim?

    int sonuc = executenonquery(bıdıbıdı)

    if (sonuc == 0)

    {yetkin yok}

    else if (sonuc == 2)

    {kullanıcı var}

    else if (sonuc == 1)

    {eklendi}

    lütfen yardım edin benim için çok önemli.


    Gökhan Atılgan

    15 Eylül 2014 Pazartesi 07:32

Yanıtlar

    • Senin yazdigin SP pek de anlasilir gelmedi. Bos vaktinde iyice incele gercekten ne yapmak istedigini.
    • SP yazmakta cok usta degil isen, boyle isler icin pekala SP yerine dogrudan C# tarafinda kod yazabilirsin.
    • Kodunda ne yazdigini goremiyoruz. Tabii ki bidibidi diye bir kod olmaz. O bolum onemsizmis gibi gecistirmissin ama sonuc alamamanin nedenlerinden birisi de bu olabilir.
    • ExecuteNonQuery. ExecuteScalar vs komutlari kullanirken yardim dosyasini oku once. ExecuteNonQuery() metodunda donen int deger etkilenen satir sayisidir ve senin return degerlerinle bir alakasi yok (ornegin update ... komutuyla 50 satir degisiklige ugradiysa 50 doner).
    • SP'den geriye "return" disinda da deger almak istiyorsan output parametreleri kullan.
    • SP'den return parametresini almak icin komutuna ParameterDirection.ReturnVaue olan bir parametre ekle. 

    Asagida senin SP'yi baz alan kod ornegi mevcut:

    int returnValue;
    using (SqlConnection con = new SqlConnection(@"Server=.\SQLExpress;Database=Test;Trusted_Connection=yes"))
    {
      var cmd = new SqlCommand("SP_AdminEkle",con);
      cmd.CommandType = CommandType.StoredProcedure;
      cmd.Parameters.AddWithValue("@kullaniciadi", "cetin");
      cmd.Parameters.AddWithValue("@sifre", "secret");
      cmd.Parameters.AddWithValue("@adsoyad","cetin basoz");
      cmd.Parameters.AddWithValue("@yetki",1);
      cmd.Parameters.AddWithValue("@yetkiid",1);
      cmd.Parameters.AddWithValue("@returnValue",-1).Direction = ParameterDirection.ReturnValue;
      con.Open();
      cmd.ExecuteNonQuery();
      returnValue = cmd.Parameters["@returnValue"].Value;
      con.Close();
    }
    
    

      

    15 Eylül 2014 Pazartesi 16:23