Şimdi Ara

SQL Server Store Procedure için yardım

Daha Fazla
Bu Konudaki Kullanıcılar: Daha Az
2 Misafir - 2 Masaüstü
5 sn
3
Cevap
0
Favori
115
Tıklama
Daha Fazla
İstatistik
  • Konu İstatistikleri Yükleniyor
0 oy
Öne Çıkar
Sayfa: 1
Giriş
Mesaj
  • Arkadaşlar ben bir veritabanı uygulaması yapıyorum sorgularımı strore procedure üzerinden yapmaya çalışıyorum parametreyle yapamadım bir türlü sorg

    Veritabanında tabloda ki kayıtları kontrol edip aynı kayıt yapılmasına engel olmak amacıyla bu sınıfı oluştrudum.



           

    Bu kodlarla çalışıyor sıkıntım yok ama bu şekilde yapmak istemiyorum.

    public static int Kontrol(int gelensayi)
    {
    int sayi;

    SqlCommand komut = new SqlCommand("Select * from MASA Where MASANO="+gelensayi, Tools.Baglanti);

    Tools.Baglanti.Open();


    if (komut.ExecuteScalar() == null) sayi = 0; else sayi = 1;


    Tools.Baglanti.Close();


    return sayi;

    }



    Yapmak istediğim şekil böyle bişeyler



    SqlDataAdapter adp = new SqlDataAdapter("KayitKontrol", Tools.Baglanti);
    adp.SelectCommand.Parameters.AddWithValue("@MN","MASANO");
    DataTable dt = new DataTable();
    adp.Fill(dt);
    int sayi=dt.Rows.Count;




    yada şunun gibi bişeyde olur





    public static int Kontrol(int gelensayi)
    {
    int sayi;

    SqlCommand komut = new SqlCommand("KayitKontrol", Tools.Baglanti);
    komut.Commandtype=Commandtype.StoreProcedure;

    Tools.Baglanti.Open();


    if (komut.ExecuteScalar() == null) sayi = 0; else sayi = 1;


    Tools.Baglanti.Close();


    return sayi;






    Storeprocedure sorgusu


    create procedure KayitKontrol
    @MN int

    as

    select * from MASA where MASANO=@MN








  • kolon sayma işlemi için procedüre kullanmak mantıksız geliyor.executeScalar tek satırda hallediyor zaten.

    bunu şöyle kullanırım ben.
    örneğin üye kayıt olacak.store proc oluştururum.ad,soyad,mail gibi bilgileri gönderirim.procedüre içinde uniq olanları yani benzersiz olanları kontrol ederim.örneğin bu email daha önce kayıt edilmiş mi? gibi.tabi bundan önce de o sütuna constraint ile uniq atarım.

    yapman gereken
    ----------------------------store procedüre kullanmadan : --------------------------------------
    string query ="select count(id) from tablo_adi where masano=@masano"
    Sqlcommand cmd=new sqlcommand(query,connection);
    cmd.parameters.addwithValue("@masano",value")

    cmd.connection.open();
    int adet=cmd.executeScalar(); -- kaç satır olduğunu döner.0 ise yok demektir.bu ifadeleri try , catch içine al.hatta genel bir static class oluştur.dbişlemleri altında.her sayfadan bunu kullanabilirsin.

    --------------------------store procedüre kullanarak yapmak istersen :--------------------------------

    STORE PROCEDÜRE İÇİNDE YAPACAĞIN DEĞİŞİKLİKLER :
    create proc procName
    (
    @masano int
    @adet int output -- output ile geri döneceğini bildirirsin.
    )
    as
    set @adet= ( select count(id) from tabloname where masano=@masano ) -- adedi ayarladık.
    NOT : ne olur olmaz diye procedürlerde de try-catch kullanırım.hatalari(loglari) kaydeden bir tablo oluştururum.catch içinde bu tabloya şu işlem yapılırken hata oluştu diye eklerim.

    CODE BEHİND TARAFINDA YAPACAĞIN DEĞİŞİKLİKLER :
    string query ="procName" -- store procedüre ismi yazılır
    Sqlcommand cmd=new sqlcommand(query,connection);
    cmd.commandtype=commandtype.storeprocedüre; -- cmd bir store procedürdür.
    cmd.parameters.addwithValue("@masano",value")
    cmd.parameters["@adet"].direction=parameterDirection.output; -- geri dönüş parametresi olacağını söylemen lazım.
    cmd.executeNonQuery() -- cmd.executenonquery() kullanılır.

    dönen değeri okumak için ;
    int adet = convert.toint32(cmd.parameters["@adet"].Value);


    yazımda büyük - küçük pek duyarlı olamadım :)
    ama dediğim gibi mssql de aggregate kullanımları için executeScalar() daha mantıklıdır.procedüre kullanmaya gerek yoktur.



    < Bu mesaj bu kişi tarafından değiştirildi chnkyn -- 12 Temmuz 2019; 19:22:25 >




  • 
Sayfa: 1
- x
Bildirim
mesajınız kopyalandı (ctrl+v) yapıştırmak istediğiniz yere yapıştırabilirsiniz.