Coder

25 Mayıs 2012

Sql de sepete ekle uygulaması

E-ticaret sitelerinde gördüğümüz sepet işlemini veritabanı üzerinde nasıl gerçekleşiyor mini bir örnekle uygulayalım. Ms Sql Server üzerinde uyguladığımız örnek için gerekli araçlar; 1 adet database, içinde 3 tablo(Kullanıcı, Ürün, Sepet) ve bu tabloların birbirleri ile ilişkilendirilmesi.

Veritabanını ve tabloları oluşturduktan sonra ilişkilendirme işlemine geçin; Sepet tablosundaki primary key olan kullaniciid Kullanıcı tablosundaki kullaniciid ile tekrar Sepet tablosundaki primary key olan urunkod kolonunu Ürün tablosundaki urunkod kolonu ile ilişkilendirin. Uygulamayı çalıştırmak için kullanıcı ve ürün tablosuna kayıt eklemeyi unutmayın.

Sepet tablosunda iki tane primary key olduğunu dikkat etmişsinizdir. Bir tablo içinde iki veya daha fazla primary key kolon oluşturmak için tablo içinde shift tuşuna basarak primary key yapmak istediğiniz kolonların hepsini seçin sağ tuş tıklayıp primary key yapabilirsiniz.

Veritabanımız hazırsa sepete ekle uygulaması için stored procedure geçebiliriz.

[cc lang="sql"]create proc sp_sepeteekle(@kullaniciid int, @urunid int, @adet int=1)
as set nocount on
if @kullaniciid is null or @urunid is null
return 0
else if exists(select * from tblsepet where kullaniciid=@kullaniciid and urunkod=@urunid)
update tblsepet set adet=adet+@adet where kullaniciid=@kullaniciid and urunkod=@urunid
else
insert into tblsepet values (@kullaniciid, @urunid, @adet)
set nocount off [/cc]

Aynı üründen tekrar eklediğinde sadece adet kısmı artıyor. Bu şekildeki mini sepet uygulamasından esinlenerek ileri uygulamalarınız da kullanabilirsiniz.

Procedure’ü çalıştırmak için(kullanıcı ve ürün girdiğinizi varsayarak);

[cc lang="sql"]exec sp_sepeteekle 1,3,2[/cc]

03 Eylül 2011

Stored procedure output ile mail kontrolü

Veritabanımızda sık sık sp’leri kullanırız. Bir çok işlemi sp üzerinde yapabilmekteyiz. Örnek verecek olursak; ürün giriş veya üye kayıt kısmında; masaüstü veya web sitemiz dolayısı ile parametre gönderip işlemi Stored procedure ile bitiriyoruz.

Sp’deki output ile veri tabanından parametre alabiliyoruz. Şöyle ki; e-posta adreslerini tutan veritabanımız ve C# da yazılmış masaüstü uygulamamız olsun. Form yardımı ile girilen e-posta adresini veritabanından kontrol edip, mail adresi varsa kullanıcıya kayıtlı olduğunu belirtip, yoksa kayıt ettirebiliriz. Benzer şekilde Stored procedure output ile arama yaptırabiliriz. Burada yapılan olay parametrenin databasee gidip tekrar geri dönmesinden ibarettir.

Başlıkta belirttiğim üzere mail kontrolü yapan Stored procedure‘li masaüstü uygulaması yapalım;

Resimdeki gibi form ekranı oluşturduktan sonra kod kısmına geçmeden veritabanımıza output parametreli Stored procedure yazalım;

[cc lang="sql"]create proc sp_coder_output (@dmail nvarchar(50), @var int output)
as
begin
if exists (select mail from tblmail where mail=@dmail)
begin
select @var=1
end
else
begin
insert into tblmail (mail) values (@dmail)
end
end[/cc]

Burada @dmail ve output parametreli tabloda olmayan @var isimli int tipli değişken tanımladık. İf ile kontrol edip, eğer mail adresi daha önceden eklenmiş ise @var değişkenine 1 atamakta, yoksa kayıt etmekte (Database adı: coder, tablo adı: tblmail, kolon adı: mail, tabloda id ve mail kolonları bulunmakta). Sql ile işimi bitirip formda kaldığımız yerden devam edelim.

Butonu çift tıklayıp kod tarafına geliyoruz.
[cc lang="c#"]
string varmi;
SqlConnection sql = new SqlConnection(“server=.; database=coder; trusted_connection=true;”);
SqlCommand cmd = new SqlCommand();
cmd.Connection = sql;

cmd.CommandText = “sp_coder_output”;
cmd.CommandType = CommandType.StoredProcedure;

cmd.Parameters.Add(“@dmail”, SqlDbType.NVarChar, 50);
cmd.Parameters.Add(“@var”, SqlDbType.Int);

cmd.Parameters["@dmail"].Value = textBox1.Text;
cmd.Parameters["@var"].Direction = ParameterDirection.Output;

sql.Open();
cmd.ExecuteNonQuery();
varmi = cmd.Parameters["@var"].Value.ToString();

if (varmi == “1″)
{
MessageBox.Show(“Daha önce eklenmiş mail adresi…”);
}
else
{
MessageBox.Show(“Mail adresi kayıt edildi…”);
}
sql.Close();
[/cc]

SqlConnection yardımı ile veri tabanına bağlandık. SqlCommand ile Procedure’ü çalıştırdık. Değişkenleri kolonlar ve tiplerine uygun olarak ekledik. ParameterDirection.Output ile parametrenin geri gelmesini sağlıyoruz. Burada gelen parametreyi Label1′e yazdırıyoruz. Değeri 1 olursa daha önceden eklenmiştir mesajı alınacak, eğer label1′in değeri 1 olmaz ise kayıt edip, edildi mesajı verecek.

25 Haziran 2011

Benzersiz veri kayıt eden masaüstü uygulaması

Stok takip, telefon defteri, ürün deposu gibi benzersiz veri kayıt eden masaüstü uygulaması geliştirelim. Günlük iş hayatında veya projelerimizde bol bol kullandığımız ürün depo kayıt işlemi yapan mini C# ile Mssql tabanlı uygulama yapalım.

İlk olarak ürün adı, miktarı ve fiyat bilgilerini tutan, form yardımı ile yeni ürün ekleyen basit sade görünüşlü resimdeki gibi ürün form ekranı oluşturalım. Bunun için 3 adet textbox, kararınca label, 1 adet buton ve listedeki ürünleri gösterebilmek için 1 adet listview.

Listview kontrolü için yapılması gerekenler; üzerine tıklayınca çıkan ok kısmından View kısmını Details olarak ayarlayın. Edit Columns…‘a tıklayarak 4 tane kolon oluşturun. Properties alanından tüm satırı seçmeye yarayan FullRowSelect özelliğini ve satır-surun çizgilerin gösterilmesi için GridLines özelliğini True yapın, böylece listview kontrolü göze gelir hale gelecek.

Bu program ile ürün adı, miktarı, fiyatı eklenir, ürün listede yani veritabanın da mevcut değilse yeni ürün olarak eklenir. Fakat ürünümüz daha önceden veritabanımıza eklenmiş ise miktarı ve fiyatı arttırılır. Formumuzu oluşturduktan sonra MsSql üzerinden yeni veritabanı oluşturup(veritabanı ismi: coder) ürünler tablosu içerisine UrunId (int, ve Primary Key olarak ayarlanacak), Urunadi (nvarchar50), Miktar (int), Fiyat (Money) olarak girip urunler isminde tabloyu kayıt edin. Bunları yapmak zor geliyorsa alttaki kodları yeni sorgu sayfası açıp(New Query) alttaki kodları çalıştırdığınızda istenilen veritabanı tablo bilgileri ile oluşacaktır.
[cc lang="sql"]Create Database [coder]
GO
/****** Object: Table [dbo].[urunler] Script Date: 06/25/2011 01:14:37 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[urunler](
[UrunId] [int] IDENTITY(1,1) NOT NULL,
[UrunAdi] [nvarchar](50) NOT NULL,
[Miktar] [int] NOT NULL,
[Fiyat] [money] NOT NULL,
CONSTRAINT [PK_urunler] PRIMARY KEY CLUSTERED
(
[UrunId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO[/cc]

Veritabanımızı ve formumuzu oluşturduktan sonra benzersiz ürün kayıt eden Stored Procedure‘ü yazabiliriz. Saklı yordamımız şöyle;
[cc lang="sql"]Create proc sp_urunkayit (@urunadi nvarchar(50), @miktar int, @fiyat money)
as
begin
if exists (select UrunAdi from urunler where UrunAdi=@urunadi)
begin
Update urunler set Miktar+=@miktar, Fiyat+=@fiyat where UrunAdi=@urunadi
end
else
begin
insert into urunler (UrunAdi,Miktar,Fiyat) values (@urunadi,@miktar,@fiyat)
end
end [/cc]

Burada yapılan olay; ürün kaydı girildiği zaman eğer veritabanımızda ürün varsa mevcut ürünün üzerine miktarı ve fiyatı ekle yani update ile güncelleştirme yapıldı. Eğer ürün daha önce eklenmemiş ise insert into deyimi ile tabloya yeni ürün eklendi. Bunu telefon rehberi programında da yapılabiliriz, şöyleki ; eğer aynı telefon numarası eklenirse ekleme yapılmasın kullanıcıya bu numaradan olduğunu veya aynı isim soyisim de kayıt olduğunu vurgulata biliriz.

Sql kısımı bu kadardı, gelelim tasarımını hazırladığımız forma işlevsellik kazandırmaya.
[cc lang="c#"]SqlConnection sql = new SqlConnection(“server=.; database=coder; trusted_connection=true;”); //bağlantıyı global tanıladık
private void btnekle_Click(object sender, EventArgs e)
{
SqlCommand cmd = new SqlCommand();
cmd.Connection = sql;

cmd.CommandText = “sp_urunkayit”; // Oluşturduğumuz procedure ü burada çağırıyoruz.
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue(“@urunadi”, txturunadi.Text); // “” arasına yazan değişkenleri procedure ü oluştururken yazmıştık. Buradaki olay bu değişken üzerinden parametre taşımak

cmd.Parameters.AddWithValue(“@miktar”, txtmiktari.Text);
SqlParameter prm = new SqlParameter(“@fiyat”, SqlDbType.Money); // money tipinde olduğu için fiyat kısmını bu şekilde yapıyoruz
prm.Value = txtfiyati.Text;
cmd.Parameters.Add(prm);

sql.Open();
int etkilenen = cmd.ExecuteNonQuery();
sql.Close();

if (etkilenen > 0)
{
MessageBox.Show(“Kayıt girildi”);
listviewdoldur();

}
else
{
MessageBox.Show(“Ürün Eklenmedi!!!”);

}
}

private void Form1_Load(object sender, EventArgs e)
{

listviewdoldur(); //form açılır açılmaz listviewi dolduryoruz
}

private void listviewdoldur()
{
listView1.Items.Clear(); //listview metod içeriği
SqlCommand cmd = new SqlCommand(“select UrunID, UrunAdi, Miktar, Fiyat FROM urunler”, sql); //tabloyu ve gerekli kolonları çaığırıyoruz
sql.Open();
SqlDataReader rdr = cmd.ExecuteReader();
while (rdr.Read())
{
ListViewItem li = new ListViewItem(); // listview içini dolduruyoruz
li.Text = rdr[0].ToString();
li.SubItems.Add(rdr[1].ToString());
li.SubItems.Add(rdr[2].ToString());
li.SubItems.Add(rdr[3].ToString());
listView1.Items.Add(li);
}
sql.Close();
}[/cc]

Gereken açıklamalar kod içinde mevcut. Burada yaptıklarım; ilk önce global olarak bağlantıyı tanımladım. Ardından listview kontrolünü veritabanından gelecek bilgiler doğrultusunda doldurdum. Bunu metod olarak form_load kısmına ekledim. Böylece sayfa açılır açılmaz veri tabanındaki ürünler listesi karışımıza çıkacak. Ardından ekle butonu sayesinde oluşturduğumuz procedure e textbox lardan girilen parametreleri ADO.Net nimetlerinden faydalanarak gönderdik. Burada dikkat edilmesi gereken procedure deki parametre değişkenlerini doğru ve tipine göre yazmak. Ve bundan sonra yapmanız gereken f5 tuşuna basıp pazardan aldığınız taze domatesi, biberi vs buzdolabına koymadan önce kayıtlarını girmek.

Burada yapılan olaylar biraz karışık gelebilir, tabi yeni başlayanlar için. Yapılanları kısa ve özet olarak geçersek; veritabanı ve tablomuzu oluşturup stored procedure ü oluşturduk. Bu procedure sayesinde daha basit ve daha hızlı şekilde ürün kaydını gerçekleştirdik. Ardından bu kayıtları girebilmek ve önizleyebilmek için form ekranı oluşturduk, Ado.net ile sql bağlantımızı kurup mercimeği fırına gönderdik….

06 Şubat 2011

Stored Procedure ile koşullu kaydetme

Tablomuza oluşturacağımız Stored Procedure ile ürün ekleyebilir. Ancak bu ürün tabloya önceden eklenmiş ise hata verecek çalışmayacak. Bunu önlemek için ilk önce ürünün olup olmadığını kontrol edip sonra ürünün eklenmesini isteyebiliriz.

Northwind veritabanı üzerinde Categories tablosuna categoriname’e ürün ekleyelim;
[cc lang="sql"]
create proc sp_kategoriyekaydet (@katadi nvarchar(30))
as
begin
if exists (select * from categories where categoryname =@katadi)
begin
print ‘kategori daha onceden eklenmiş’
end
else
begin
insert into categories (categoryname) values (@katadi)
print ‘kategori başarı ile kayıtedildi’
end

end
[/cc]

Kaynak : Cemal Can AKGÜL (Bilge Adam Yazılım Eğitmeni)

05 Şubat 2011

Stored Procedure uygulamaları

Stored Procedureler Sql ‘de işlemler bütününü çalıştırmak için derlenen özel sonuçlar üreten bileşenlerdir. Stored Procedure kullanım avantajları çoktur bunlardan birkaçı; tekrar tekrar kullanım olanağı sağlaması, birkaç sorguyu biranda sorgulama olanağı gibi kolaylık sağlamaktadır.

Stored Procedure oluşturmanın genel kullanımı şu şekildedir;
[cc lang="sql"]

CREATE PROC procedureadi
AS
BEGIN
sorgular
END

go

EXEC procedureadi — oluşturulan procedure çalıştırmak için
[/cc]

Alttaki örnek Stored Procedure uygulamaları ile daha iyi anlaşılacağını umuyorum.

Ör.1 Aynı anda üç sorgu sonucu ekrana veren bir sp(Stored Procedure) yazalım; (Örneklerimiz Northwind üzerinden çalışmaktadır)

[cc lang="sql"]
create proc sp_ucsorgu
as
begin
select * from Customers
select * from Products
select * from [Order Details]
end

go

exec sp_ucsorgu[/cc]

Ör.2 Products tablosundaki kategorisi sadece 5 olanları gösterme
[cc lang="sql"]
create proc sp_kategoriye (@katid int)
as
begin
select * from Products where CategoryID=@katid
end

go

exec sp_kategoriye 5

[/cc]

Ör.3 Products tablosuna ürün eklemek
[cc lang="sql"]

create proc sp_urunukaydet (@urunadi nvarchar(20), @katid int, @fiyat money, @stok int)
as
begin
insert into Products (ProductName, CategoryID, UnitPrice, UnitsInStock) values (@urunadi, @katid, @fiyat, @stok)
end

go

exec sp_urunukaydet ‘armut’,23,5,12 — armut kategoriid fiyatı ve stok miktarını virgüller ile ayırarak ekliyoruz.
[/cc]

Bu procedure ile birlikte exec sp_urunukaydet yazıp istediğimiz kadar ürün ekleyebiliriz.

Kaynak : Cemal Can AKGÜL (Bilge Adam Yazılım Eğitmeni)

20 Ocak 2011

Veri tabanına kayıt ekleme Insert Into

Sql’de varolan veri tabanına kayıt eklemek için kullanılan kelime Insert Into. Bununla istediğimiz tabloya veri ekleyebiliriz.

Ör. Tablom isimli tablomuza kolonları belirterek urunadi Bardak, urunfiyati 15 urunno 0030 olan veri ekleyelim.

[cc lang="sql"]INSERT INTO tablom (urunadi,urunfiyati,urunno) VALUES (‘Bardak’,15,’0030′)[/cc]

Kolonları yazmadan da tablomuza veri ekleyebiliriz

[cc lang="sql"]INSERT INTO tablom VALUES (‘Bardak’,15,’0030′)[/cc]

Tablodaki sütunlarda boş değer olmasını istiyorsak

[cc lang="sql"]INSERT INTO tablom VALUES (‘Bardak’,NULL,’0030′)[/cc]

Sql’de sayısal loto yapımı

Biraz saçma gibi gelse de sql üzerinde karar yapılarını ve döngüleri kavraya bilmek için sayısal loto örneğini yazma isteği duydum. Sql’de sayısal loto yapımına atlamadan önce kullanılan komutlardan bahsedelim. Yabancısı olduğumuz Declare komutu ile işlemde kullanılacak değişkenleri tanımlamak için kullanırız.

Örneğe geçecek olursak;

[cc lang="sql"]
declare @sayisal table
(
sayi int
)
declare @rastgele int
declare @sayac int

select @rastgele = 0
select @sayac = 0

while (@sayac<6) begin select @rastgele = CONVERT(int, rand() * 48) +1 if not exists (select * from @sayisal where sayi =@rastgele) begin insert into @sayisal values (@rastgele) set @sayac +=1 end end select * from @sayisal[/cc] @rastgele , @sayi adında iki tane değişken tanımladık, sıfıra eşitledik. While döngüsü ile for gibi sayacı 1 arttırarak(sql’de for döngüsü olmadığı için while’ı böyle kullanıyoruz) 6 adet rastgele değer ataması için dögüyü döndürüyoruz.

select @rastgele = CONVERT(int, rand() * 48) +1 ile rastgele sayı üretip sonucun 0 gelmemesi içinde +1 ekliyoruz.

if not exists (select * from @sayisal where sayi =@rastgele) ile aynı sayı gelmemesi için şart koyuyoruz. Döngü ve şartın sonunda çıkan değeri tabloda göstermek için select * from @sayisal yazıp işlemi bitiriyoruz.

Kaynak : Cemal Can AKGÜL (Bilge Adam Yazılım Eğitmeni)

Bir başka örnek uygulama;

Biraz daha şekillendirmek istersek, mesela 10 ile 50 arasındaki sayılardan seçip oluşturduğumuz tabloya beşer beşer ekleyebiliriz. Şöyle ki 48 yerine 40 yazıp yani 40 ile çarpıp 1 yerine 10 yazdığımızda 10 ile 50 aralığında rastgele sayılar üretilecektir. Bu üretilen sayıyı sayilar isimli tabloya insert into @sayisal satırındaki @sayisal değişkeninin yerine sayilar tablomuzu koyarak oluşturulan sayıları tablomuza ekleyebiliriz. Nası yapılır, nası edilir kodları aşağıda, inceleyin;

[cc lang="sql"]DECLARE @sayisal TABLE
(
sayi INT
)
DECLARE @rastgele INT
DECLARE @sayac INT

SELECT @rastgele = 0
SELECT @sayac = 0

while (@sayac<5) BEGIN SELECT @rastgele = CONVERT(INT, rand() * 40) +10 IF NOT EXISTS (SELECT * FROM @sayisal WHERE sayi =@rastgele) BEGIN INSERT INTO Sayilar VALUES (@rastgele) SET @sayac +=1 END END [/cc]

Powered by WordPress