Arama butonu
Bu konudaki kullanıcılar: 1 misafir
1
Cevap
115
Tıklama
0
Öne Çıkarma
SQL Server Store Procedure için yardım
A
5 yıl
Çavuş
Konu Sahibi

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




C
5 yıl
Çavuş

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 >

DH Mobil uygulaması ile devam edin. Mobil tarayıcınız ile mümkün olanların yanı sıra, birçok yeni ve faydalı özelliğe erişin. Gizle ve güncelleme çıkana kadar tekrar gösterme.