24 Ağustos 2010 Salı

Object Relational Mapping(ORM) ve Entity Kavrami

C# 3.0 yeniliklerinden bahsederken, tum bu yeniliklerin LINQ'nun alt yapisini olusturdugunu, tum yeniliklerin amacinin LINQ'yu daha yaygin bir bicimde kullanmak oldugunu soylemistik. Yavas yavas LINQ teknolojisine alismamizda yarar olacaktir sanirim, cunku tam anlamiyla ogrenildigi zaman gercekten buyuk kolaylik getiriyor kodlamaya. Kisa sure icerisinde cok yaygin bicimde kullanilacak bir teknoloji olacagindan suphe yok. Simdi LINQ to SQL konusuna gecmeden kisa kisa Object Relational Mapping ile ilgili birkac tanimlama yapacagim. Kabataslak konusmak gerekirse, iki farkli ORM araci vardir. Bunlar;

  • LINQ to SQL (basic)
  • Entity Framework (advanced)
tür.
Aralarindaki fark parantez iclerinde de belirtildigi gibi biri basic'tir digeri advanced. Bunun nedeni de LINQ to SQL'in, C# developerlari tarafindan, Entity Framework'un de Ado.Net'ciler tarafindan kodlanmasidir.

Iki farkli arac dedik ama aslinda ikisinin de yaptigi is ayni. Sonucta ikisi de ORM aracidir. Peki nedir bu ORM? Isminden de belli olacagi uzere, iliskisel nesne eslestirimi. Database uzerinden ornek verirsek, sinif ile tabloyu, kolon ile property'i ve satir ile nesneyi eslestirmektir ORM. Bu eslestirmenin sonucunda da Code Generatorler Sql'e bakip tablolara gore sinif, property .. vs. kendisi bizim yerimize otomatik olarak yaratiyor.

Bir sonraki makalede daha ayrintili uzerinde duracagiz ama LINQ to SQL nasil kullanacagiz, hangi adimlari uygulayacagiz kisaca madde madde uzerinde durmak gerekirse;
  • Erişilmek istenen tabloya ait Entity sınıfı oluşturulur.
  • Connection açmak, command çalıştırmak gibi işlerden sorumlu olan DataContext nesnesi oluşturulur.
  • DataContext nesnemiz kullanılarak ilgili tablodan data çekilebilir.
Kisaca Entity kavramindan da bahsetmek gerekirse, veritabanındaki tabloya karşılık oluşturulmuş her bir sınıfa Entity sınıfı denmektedir. Bir entity sınıfının nesnesini Ram'e çıkarttığımızda, cikarttigimiz bu nesneye de entity denmektedir ayni zamanda. Çok sık duyacagımız kavramlardan biri de Entity yuklemek olacak. Bu da, satirin bilgilerini tutan bir entity nesnesini RAM'e cikartmaktir anlamina gelir.


21 Ağustos 2010 Cumartesi

Sql'de Subquery

Subquery kisaca ic ice select sorgulari yazmak demektir. Bazi durumlarda bizi joinle iki satiri eslesmekten kurtarip daha performansla calismasini saglar programin. Kisaca bir ornek uzerinden gosterip, yazilim kurallarini belirtmek gerekirse;

Seneryomuz, AdventureWorks Database'i uzerinden, ListeFiyati ortalama fiyatin uzerinde olan verileri getiren kod yazalim.

SELECT * FROM Production.Product WHERE ListPrice>(SELECT AVG(ListPrice) FROM Production.Product)

Gordugunuz uzere Select sorgusunun icine bir Select daha kullandik.

Kisaca uymamiz gereken kurallar da su sekildedir;

  • Icerideki Select sorgusu mutlaka parantezler "()" icerisinde yazilmalidir.
  • Icerideki Select sorgusu mutlaka tek bir deger dondurmelidir. Bunun icin Aggregate fonksiyonlari(Max,Min,Avg,Sum) kullanilmalidir veya TOP 1 ..vs. gibi komutlarla tek bir deger dondurulmeli.

Sql Triggers (Tetikleyiciler)

Sql'in en onemli ve en cok kullanilan ozelliklerinden biri de tetikleyici(triggers) kavramidir. Kisaca ne anlama geldigini incelersek, Turkce karsiligindan bir seyler belirmistir. Sql dilinden konusursak, insert, delete veya update islemleri yapildiktan hemen sonra devreye girip belirtilen isleri yapmakla yukumlu kontrollerimizdir. C#'daki karsiligi eventlerdir(olaylar). Fakat burada delegelerle karsilasmayacagiz cok şükür. :)

Olusturulma syntax'i function,view,sp'ler gibidir;

CREATE TRIGGER TriggerIsmi
ON TetiklenecekTablo
AFTER Delete/Update/Insert
AS
BEGIN
--Yapmak istedigimiz sorgular
END

Olusturulma mantigini gosterdikten sonra da bir kac komut tanimlamaya calisacagim. Ozellikle triggerlar da en cok kullanilan komutlardan biri de ROLLBACK kavramidir;

* Rollback: Trigger içinde rollback komutu çalıştığında, triggerı tetiklemiş olan işlem iptal edilir.

* Triggerlarda bilmemiz gereken en onemli konulardan biri de, triggerlarin kendi iclerinde kullandiklari iki tablolari vardir.
  1. Inserted
  2. Deleted
* Bu tablolar Disc'de bulunmazlar. Ram'de bizim icin triggerlarin calisma sirasinda olusturulup bize sanal tablo yaratirlar.
* Eger insert islemi yapip triggerlari calistiriyorsak, eklenen verilerimiz Inserted tablosunda saklanir. Eger Delete islemini yaparsak da, silinen veri Deleted sozde tablosuna tasinir.
** Eger Update islemi yaparsak da, eski deger Deleted tablosuna, update ettigimiz yeni veri de Inserted sozde tablosuna tasinir.

20 Ağustos 2010 Cuma

Sql'de Stored Procedure

Sql'de en cok kullanilan yapilardan biri de stored procedurelerdir. Ozellikle yaptigimiz projeye veri getirmek, veri eklemek, veri silmek gibi veri islemleri stored procedure yardimiyla yapilir. Simdi basit olarak sp'lerin sql icerisinde nasil tanimlandiklarini, nasil calistirildiklarini ve var olan sp'lerin sql icerisinde nerede saklandiklarini kisaca inceleyelim.

CREATE PROC KategoriEkle(@KategoriAdi NVARCHAR(50))
AS
BEGIN
INSERT INTO Kategori(KategoriAdi) VALUES (@KategoriAdi)
END

Gordugunuz uzere Kategori tablosuna kategoriAdi ekleyen kisa bir stored procedure yazdik. Simdi bunu execute edersek,

EXECUTE KategoriEkle 'Buzdolabi'

Sp'leri execute ederken uyulmasi gereken kural, execute anahtar sozcugunun hemen ardindan sp adi ve parametre aliyorsa parametre ismi.

Stored Procedure'lerin olusturulmasini ve calistirilmasini inceledikten sonra simdi de var olan sp'lerin sql icerisinde nerede saklandigina kisaca bakalim. Yazdigimiz sp'ler object explorerda ilgili database'in icerisinde programmability icerisindeki stored procedure dosyasinin icinde saklanmaktadir.



Ipucu: Stored procedure'ler yukaridaki ornek gibi parametre alabilirken, parametre almayan versiyonlari da mevcuttur. Peki eger bir sp parametre almiyorsa, view'dan farki nedir?

Cevap: Performans olarak Sp'ler View'lara gore daha basarilidir. Fakat biz sorgumuzda sorgu icerisinde bir sorgu daha kullanirsak (join,group by,order by ...vs.) viewlari tercih ederiz cunku Storep Procedureler buna izin vermezler.

18 Ağustos 2010 Çarşamba

Sql Constraints(Kisitlamalar)

Constraints :
Tablodaki bir kolona girilebilecek değerlerin kısıtlanması için oluşturulan veritabanı nesnesidir.

Kısıtlar:
1)Primary Key : Satırlara özgünlük sağlayan kolon, Primary Key yapılmalıdır. Bu çoğu zaman ID kolonudur. Primary Key kısıtının getirildiği bir kolonda TEKRAR KAYITLAR BULUNAMAZ! Bir tabloda sadece bir tane Primary Key kısıtlaması konulabilir.

2)Foreign Key :Bir kolona girilen değerlerin, aynı ya da başka bir tabloda bulunan bir başka kolonda bulunmasını garanti eder... Örneğin, Müşteri'nin Meslek ID kolonuna girilen değerlerin Meslek tablosundaki MeslekID kolonunda bulunması gibi...

3)NULL Kısıtlaması : O kolona mutlaka değer girilmesini sağlar.

4)DEFAULT : Bir kolona, default değer tanımlama anlamına gelir. Eğer veri girişi yapılırken kolon boş geçilirse, DEFAULT kısıtlaması devreye girerek, o kolona varsayılan bir değer atanmasını sağlar.

5)Check Kısıtlaması : Bir kolona girilen değerlerin belli bir formatta olmasını garanti eder. Örneğin, Email formatı, telefon no formatı gibi...

6)Unique Kısıtlaması : Kolonda tekrarlı kayıt olmamasını sağlar. Unique kısıtlaması birden fazla yapılabilir.

Sql'de View Kavrami

View'lar icin kisaca SELECT tutan nesnelerdir diyebiliriz. Genis kapsamli database islemlerinde, ozellikle tablo sayisi ve kolon sayilarinin oldukca fazla oldugu islemlerde, her defasinda cekecegimiz verileri uzun uzun kolon isimleriyle belirtmektense, bunlari bir VIEW icerisine yerlestirip, daha sonra cagiracagimiz zaman da "SELECT * FROM ViewAdi" seklinde cagirirsak, hem kodlamada kolaylik saglamis oluruz, hem de daha profesyonel bir yapi kazandirmis oluruz kodlarimiza. Kisaca View'lerin nasil yaratildigina ve nasil kullanildiklarini inceleyelim.

CREATE VIEW BolgelereGoreSatislar
AS
SELECT UrunId,UrunAdi,ListaFiyati,MagazaAdi FROM Urun --kolon sayisi daha fazla da olabilirdi.

Execute ettikten sonra View'imizi olusturmus olacagiz. Artik BolgelereGoreSatislar isimli bir tablomuz varmis gibi direk,

SELECT * FROM BolgelereGoreSatislar

diyerek ustte yazdigimiz SELECT komutuna erismis olacagiz.

16 Ağustos 2010 Pazartesi

Sql Fonksiyonlari(Sql Functions)

1-Metinsel Fonksiyonlar:
--LEN() : Girilen stringin karakter sayisini geri donduren fonksiyon.

SELECT LEN('deneme') --ekran ciktisi 6 olacaktir.

--REPLACE() : Girilen string icindeki karakterleri, belirtilen karakterlere donusturen fonksiyondur.

SELECT REPLACE('al su takatukalari takatukaciya takatukalatmaya gotur','takatuka','ayakkabi')

Ekran ciktisi -- 'al su ayakkabilari ayakkabiciya ayakkabilatmaya gotur'

--(L,R)TRIM(): Girilen stringin solundan veya sagindan belli bir kismi kesmek icin kullanilan fonksiyonlardir.

SELECT LTRIM(' deneme')--cikti: 'deneme'
SELECT RTRIM('deneme ')--cikti:'deneme'

--CHARINDEX(): Girilen degerin bir string icerisinde kacinci sirada oldugunu gosteren fonksiyondur.

SELECT CHARINDEX('@','ergin@asdikjg.sdfon')--cikti 6 olur.6.sirada olduguna dikkat ediniz.

--SUBSTRING():Girilen stringin,belirli bir siradan belirli sayida degeri cekmemizi saglayan fonksiyonlardir.

SELECT SUBSTRING('deneme test',3,4)--cikti:neme

2-Tarihsel Fonksiyonlar:
--Getdate(): O anki tarihi getiren kod.

SELECT Getdate() -- 2010-08-16 15:16:02.037

--YEAR,MONTH,DAY:

SELECT Year(getdate())--yili getirir
SELECT Month(getdate())--ay'i getirir
SELECT Day(getdate())--gunu getirir.

--DATEPART:
Cok sık kullanılan fonksiyonlardan biridir. Tarihsel islemler uzerinde istedigimiz sonucu getirmemize olanak saglar. Asagidaki ornekleri inceledigimiz zaman daha iyi anlayacagiz.

SELECT Datepart(dd,getdate()) -- o anki gunu getiren kod
SELECT Datepart(dw,getdate())--haftanin kacinci gunu oldugunu getirir
SELECT Datepart(dayofyear,getdate())--yilin kacinci gunu oldugunu getirir
SELECT Datepart(week,getdate())--yilin kacinci haftasi oldugunu getirir.

--DATEDIFF:
Yine cok sık kullanılan tarihsel fonksiyonlardan biri de Datediff fonksiyonudur. Girilen iki tarih arasindaki farki istenilen sekilde(ay,yil veya gun olarak) geri donduren fonksiyondur.

SELECT Datediff(MM,'01.01.2010','05.06.2010') 

3-Aggregate Fonksiyonlar:
--SUM(): Adindan da belli olacagi uzere belli bir kolonun veya degerin toplamini alan fonksiyondur.

SELECT Sum(ListeFiyati) FROM Urun

--Count(): Belli kolon uzerinde kac deger oldugunu gosteren fonksiyonlardir.

SELECT Count(*) FROM Urun
SELECT Count(AltKategoriId) FROM Urun