Respond needs javascript to run. To find out more click here
Sql » Serdar Demir
RSS
 

Posts Tagged ‘Sql’

Linq to sql nedir ?

10 Nis

Linq to sql e ilk adımımız

Linq .net 3.5 ile gelen yeni teknolojilerden,  Linq teknolijisi tamamen veri erişim işlemini daha kolay ve anlaşılır hale getirme amaçlı. Bu veri erişim yöntemleri Linq to XML,Linq to object ve linq to sql olarak veri kaynağına göre değişiklik göstermekte. Biz bugun linq to sql i inceleyeceğiz.

Bundan önceki veri erişim yöntemi ado.net ti (okullarda hala bize bunu öğretiyorlar J) şimdi gelelim ikisinin farkına öncelikle şunu belirteyim linq to sql ile yaptıklarımızı ado.net ile de yapabiliriz. Fakat burda önemli olan daha kolay kullanım ve kod kısalığıdır. Klasik yöntemde nasıl yapıyorduk? En basitinden veritabanından veri çekmek için connecting stringler datatable lar datadapterler sql command bağlantıyı açma kapama gibi bir çok nesne ye ihtiyaç duyuyorduk küçük çaplı uygulamalarda bu pek göze batmıyor fakat 1000 satırlık kodu 100 satıra indirmeyi kim istemezki hemde çok kullanışlı bir şekilde lafı çok uzattık geçelim artık linq to sql  e :) ve northwind veritabanını kullanarak uygulama geliştirelim.

Öncelikle projeyi açıp add new item diyerek linq to sql class ekliyoruz.

Bize bir sayfa oluşturacak bu sayfada ise solution explorer dan projemizde kullanacağımız tabloları sürükleyip bu alana bırakıyoruz nortwind tablosunun category ve products tablosunu ekliyorum. Linq to sql bu tablolar arasında olan bire çok ilişkiyi otomatik oluşturuyor. Eğer bu işlemi manuel yapmak istersek toolbaxtan “Association”  ekleyip ilişkiyi siz beliryebilirsiniz. Bu kısımda tablo isimlerini değiştirmek isterseniz yine bu kısımda tablolarınızı türkçeleştip kullanabilirsiniz

Şimdi gelelim form kısmına öncelikle eklediğimiz linq to sql sınıfından  bir tane oluşruyoruz.

SqlConnectionStringBuilder ayar = new SqlConnectionStringBuilder();

ayar.IntegratedSecurity = true;

ayar.InitialCatalog = "Northwind";

ayar.DataSource = ".";

SqlConnection con = new SqlConnection(ayar.ConnectionString);

con.Open();

SqlCommand cmd = new SqlCommand("select * from Categories ", con);

DataTable dt = new DataTable();

SqlDataReader dr = cmd.ExecuteReader();

while (dr.Read())

{

listBox1.Items.Add(dr.GetString(0));

}

Yukarda da görüldüğü gibi basit bir işlemde bile kod  neredeyse 2 katına çıktı bunun çok büyük bir uygulama olacağını düşündüğümüzde fark çok açıktır. Diyelim ki bizim şimdi yapacağımız gibi 2 tabloyu bağlama işlemi yapacaksınız bunu  ado ile yapacaksanız  datarelation gibi ekstra nesneler kullanmanız gerekecek J yani dediğim gibi işler değiştikçe kod çok karışıyor. Bu işlemleri şimdi linq ile yapalım.

Linq to sql de join

DataClasses1DataContext dc = new DataClasses1DataContext();

var urunler = (from p in dc.Products

join c in dc.Categories on p.CategoryID equals c.CategoryID

select p.Category.CategoryName).Distinct();

foreach (var item in urunler)

{

MessageBox.Show(item.ToString());

}

Products ve categories tablosunda ortak sütun category id ye göre inner join işlemini gerçekleştirdik.

Şimdi de linq to sql ile where ve like işlemi:

//Where işlemi

DataClasses1DataContext dc = new DataClasses1DataContext();

var urun = from urunler in dc.Products

where urunler.ProductName.Contains("Chai")

select urunler.ProductName;

foreach (string item in urun)

{

listBox1.Items.Add(item);

}

//like işlemi

DataClasses1DataContext dc = new DataClasses1DataContext();

var urunler = from p in dc.Categories

where SqlMethods.Like(p.CategoryName, "B%")

select p.CategoryName;

foreach (var item in urunler)

{

listBox1.Items.Add(item);
}

Like işlemini kullanabilmeniz için sqlmethods un yer aldığı data.sqlclient kütüphanesini eklemeniz gerekmektedir.

Linq to sql group by işlemi

DataClasses1DataContext dc = new DataClasses1DataContext();

var urun = from urunler in dc.Products

group urunler by urunler.ProductName;

foreach (var item in urun)

{

listBox1.Items.Add(item.Key.ToString());

}

Şimdi gelelim veri işleme kısmına “Update Delete ve Insert” işlemleri

Linq to sql insert işlemi

Diyelim ki okul adında bir tablomuz var ve biz bu tabloya okul adı ve adresini girmek istioruz.

void kaydet()

{

DataClasses1DataContext dc = new DataClasses1DataContext();

okul yeni = new okul()// Tabo adımız

{

okuladi = "Mersin Üniversitesi",

adres = "Erdemli"

};

dc.okuls.InsertOnSubmit(yeni);

dc.SubmitChanges();
}

Linq to sql delete işlemi

Insert işlemi ile eklediğimiz kaydı silelim;

void sil()

{

DataClasses1DataContext dc = new DataClasses1DataContext();

okul yeni = dc.okuls (k => k.okulid == 0);

dc.okuls.DeleteOnSubmit(yeni);

dc.SubmitChanges();

}

Şimdi burda şimdiye kadar görmediğimiz bir ifade ile karşı karşıyayız lambda ifadesi => yani yukarıdaki kodun karşılığı k adında takma bir kayıt oluşturduk. Ve bu kaydın id si 0 olan ilk kaydı silmesini istiyoruz. Silme işlemide bir bakıma güncelleme yapılmasını gerektirir bu yüzden update işleminide bu mantıkla yapacağız.

Linq to sql update işlemi

void guncelle()

{

DataClasses1DataContext dc = new DataClasses1DataContext();

okul yeni = dc.okuls.First(k => k.okulid == 0);

yeni.adres = "safranbolu";

dc.SubmitChanges();

}

Bir sonraki makalemizde => ifadeleirini ayrıntılı olarak inceleyeceğiz.

 
4 Comments

Posted in C#, Makaleler

 

Sql trigger nedir resimli anlatım

01 Ağu

Sql trigger

Trigger nedir?

Trigger tetikleyici anlamına gelir programlarımızda belirli bir işlem gerçekleştiğinde programımızı tetiklemeye yarar veya tablolar arası veri bütünlüğünü korumak için kullanılırlar. Aslında triggerlar bir store proceduredür fakat farkı kendiliğinden çalışmasıdır.

Triggerlarda ya hep ya hiç mantığı vardır yani program zorlukla karşı karşıya kaldıgında bütün işlem geri döner. Örneğin atmden para çekiyorsunuz parayı aldığınızda sizin hesabınızdan para düşülmemişse işlemin yarısında elektrik kesilmişşe vb. Olaylarda yapılan bütün işlemler iptal olur geri döner (transaction konusunda ayrıntılı anlatcağım)Bu işlemi rollback transaction ifadesi ile gerçekleştirir trigger tanımlamamız içinde transaction blogu olması gerekir.

Rollback transaction ifadesini minimum düzeyde kullanmamız önerilir çünkü büyük veritabanlarında bu işlemlerin yapılması çok büyük yük oluşturur buda performasın düşmesine sebep olur. Triggerlarla silme, güncelleme, ekleme işlemlerini yapabiliriz. Yani bir tabloda birden fazla trigger tanımlayabiliriz.

Trigger tanımlama:

Tabloyu seçip all tasks/manage triggers diyerek bize aşağıdaki gibi hazır bir şablon oluşturur.

Bu şablonu kendi triggerımıza göre tasarlayacağız. Triggerımıza bir isim veriyoruz daha sonra for insert,delete,update işlemlerinden  birini seçiyoruz(trigger seçtiğimiz işlem gerçekleştiğinde devreye girecek)

Delete triggerı :

Bu trigger tablodan silme işlemlerinde tetiklenir ve silinen verinin bir kopyasını deleted tablosunda saklar bunu  Örnek bir trigger oluşrarak anlatalım

Veritabanımızdan veri silmek istendiğinde hem silme işlemini önleyelim hemde silemezsin mesajı yayınlayalım.

Create trigger silme

on serdar for delete

as

if(select count(*) from deleted)>0

begin

raiserror(‘ Oops Bu tablodan veri silemezsiniz !!’,16,1)

//bu sayılar ne diye aklınıza bi soru gelebilir billiyodum ama unuttum gereksiz bişeydi

Rollback transaction

Return

End

Bu kodu üstteki formda veya query analayser da çalıştırdığımızda trigger oluşturuluyor bunu üstteki resimde new yazan açılır listede şeklinde trigger oluşturduğunu görürüz.

Gelelim triggerımızı denemeye tablomuzdan adı serdar olan kaydımızı silmeye çalışalım.

Delete from serdar where isim=’serdar’

Bu hata mesajı ile karşılaşıyoruz.

Insert triggerı:

Bir tablo içerisine veri eklemek için insert ifadesi kullanılır. Bu trigger insert işlemi gerçekleştiğinde inserted diye sanal bir tablo oluşturur ve ana tabloya eklenen veri inserted tablosuna da eklenir. İnsert triggerını bir uygulama ile açıklayalım: Sql final sınavında soruyu yanlış anlayıp yazdığım triggera benzer bir örnek J  Diyelim ki internetten satiş yapan bir firmayız satılan mallar giriş yapılan mallar stok durumunun tutlduğu tablolarımız var örneğin stok tablomuzda stok miktarı satılan  adet ve kalan adetleri saklıyoruz diger tablomuz ise satış tablosu bu tabloda satılan malın adı fiyatı vb. özellikler tutuluyor şimdi satış tablosuna bir kayıt girildiğinde benim stok tablomda satılan adetin artmasını ve elimde kalan miktarın azalmasını istiyorum bu beni iki tabloyada kayıt yapmaktan kurtaracak  gelelim triigera;

Create trigger stok_guncelle

On satis

For instert as

Update stok set stok.satilan=stok.satilan+1 from stok inner join inserted on stok.urun_id=inserted.urun_id

// biraz açıklama ekleyelim bir mal sattıgımız zaman diyelim mp3 çalar id si 1 olsun şimdi ben satış tablosuna bir kayıt eklediğimde stok tablosunda satilan sütununun  değeri 1 artacak kalan 1 azalacak (bu bir azalma kısmını Formula yoluyla tablo dizayn kısmında Formula alanına (stok-satilan) yazarak sağlıyoruz)

Aynı işlemi ürün aldığımızda da kullanabiliriz gördüğünüz gibi sadece trigger oluşturuyoruz ve otomatikmen olay gerçekleştiğinde devreye giriyor.

Son trigger çeşidimiz update triggerı:

Bu triggerımızı da delete triggerı gibi basit bir örnekle açıklayalım bu tablomuzun güncellenmesini önleyelim

Create trigger guncelle

On satis

For update as

İf update(numara)

Begin

Begin transaction

Raiserror(‘Güncelleme yapılamaz’,10,1)

Rollback transaction

Return
 
 

SQL Server DEFAULT-RULE-VIEW

17 Tem

upload-server-128x128 Tablolar ve kullanıcı tanımlı veri tipleri için kullanabileceğimiz diger bir yapı da default ve rule tanımlamalarıdır.

DEFAULT: Tablolarda boş geçilen alanlara özel ifadeler oluşturmak için bu özelliklerden yaralanılır. Tablomuzu seçip design table kısmında default value kısmına yazmış oldıgumuz deger o kısım boş geçildiğinde otomatik olarak atanacaktır Örneğin cinsiyeti boş geçilmişse otomatik olarak erkek veya kadın atayabiliriz.

RULE: Bir sütun için girilecek bilginin kontrolünü rule sayesinde sağlayabiliriz.

rule Bu kısımdan rules/new rule diyerek kuralımızı oluşturabilir örneğin tablomuza yaş sınırı koyalım @deger<50 diyerek yas kuralı oluşturuyoruz daha sonra kuralımıza çift tıklayarak bind columns diyerek hanig alanan kuralı uygulayacağımızı belirliyoruz. Bu işlemlerden sonra tablomuza yası 50 ve üstü olan bir kişiyi kayıt edemeyeceğiz böyle bir durumla karşılaşırsa hata vererek kayıt yapmamızı engelyecektir.

VIEW: Görünümler ana tabloya bağlı kalarak ana tablodan istenilen bilgileri içerecek yeni neslelerdir (sanal tablolardır).

Niçin view kullanılır?

–Güvenilik nedeniyle oluşturulabilir tablomuzun bütün sütunlarının herkes tarafından görülmesini istemeyebilirsiniz. böyle bir durumda görünüm oluşturmak işinize yarayacaktır.

–Tablolarda en çok kullanılan işlemlerden biriside iki veya daha fazla tabloyu birleştirmektir görünüm oluşturarak kod kalabalığını azaltabiliriz. Birleştirme gibi işlemleri tekrar kod yazmadan halledebiliriz.

View oluşturma: Sol daki konsoldan  new view diyerek  ekleyebiliriz

gelen panele istediğimiz SQL kodunu yazalım örneğin birleştirme yapalım:

SELECT     *, bilgi.isim AS Expr1, serdar.isim AS Expr2
FROM         bilgi INNER JOIN
serdar ON bilgi.isim = serdar.isim
SELECT     *, bilgi.isim AS Expr1, serdar.isim AS Expr2
FROM         bilgi INNER JOIN

serdar ON bilgi.isim = serdar.isim