31 Mart 2011 Perşembe

SQL NEWID Fonksiyonu

AdventureWorks veri tabanında, Production.Product tablsoundaki kayıtlardan rastegele seçilen 10 ürünü gösterelim. Bu işlemi NEWID fonksiyonunu kullanarak yapabiliriz. Bu fonksiyon yeni bir kolon oluşturur. Oluşan bu kolondaki her bir satır için GUID (Global Unique Idendifier) değerler üretir. Bu değerler özgün olup, sadece bir kere üretileceğinden dolayı, sorgu her çalıştığında farklı GUID’ler üretir.

İlk olarak, NewId() fonksiyonunun oluşturduğu kolonu görelim.

SELECT NEWID()[Rastgele Değer] , * FROM Production.Product

Yukarıdaki kodu çalıştırdığımızda aşağıdaki gibi bir sonuç alacağız.

Untitled

 

Rastegele ilk 10 ürünü göstermek istediğimizde ise, sıralamamızı NEWID() fonksiyonunun ürettiği GUID() değerlere göre yapmamız gerekir. Sorgu her çalıştığında farklı GUID’ler üretileceğinden, elde ettiğimiz ürünler de farklı olacaktır.

SELECT TOP 10 NEWID()[Rastgele Değer], * FROM Production.Product

ORDER BY NEWID()

Untitled2

Yukarıda, Oluşan GUID’leri görmek için SELECT ifadesine NEWID() fonksiyonunu da yazdık. Ama genelde bu id’leri göstermek istemeyiz. Bu durumda sadece ORDER BY ifadesinde fonksiyonu kullanmak yeterli olacaktır

SELECT TOP 10 * FROM Production.Product

ORDER BY NEWID()

Untitled3

İstediğimiz gibi rastgele 10 ürünü elde etmiş olduk.



AdventureWorks veritabanında, Production.Product tablsoundaki ürünlerin adlarını ve renklerini getirelim. Eğer renk bilgisi null ise  ‘Renksiz’ yazsın. Bu amacımızı gerçekleştirmek için ISNULL fonksiyonundan yararlanacağız. Vereceğimiz ilk parametre Null kontrolü yapılacak olan değer, ikinci parametre ise ilk parametrenin Null olması durumunda yerine geçecek değerdir.

SELECT Name,ISNULL(Color,'Renksiz') [Renk] FROM Production.Product

Ekran çıktımız şu şekilde olacaktır.

Untitled

İstediğimiz sonucu almış durumdayız. Şimdi de Person.Address tablosundaki AddressLine1 bilgisini ve AddressLine2 kolonundaki bilgilerin ilk 10 hanesini çekelim. Eğer AddressLine2 kolonu null ise ‘Adres Bilgisi Girilmemiş’ yazsın.

SELECT AddressLine1,ISNULL(LEFT(AddressLine2,10),'Adres Bilgisi Girilmemiş') FROM Person.Address

Ekran çıktımız şu şekilde olacaktır.

Untitled2

Burada ufak bir sorunla karşı karşıyayız. 11.satır haricindeki diğer tüm satırlarda adres bilgisinin null olduğunu, ve bu sebepten dolayı ‘Adres bilgisi girilmemiş’ yazdığını görebiliyoruz. Ancak null olması durumunda yazılması gereken metnin tam olarak yazılmadığını görüyoruz. Sadece ilk 10 hanesi yazılmış durumda. Bunun sebebi; ISNULL fonksiyonununun, yerine geçeceği değişkenin tipini aynen uygulamasıdr. Bu örnek için ISNULL fonksiyonuna parametre olarak AdressLine2 kolonunun ilk 10 hanesini verdiğimiz için, yazmış olduğumuz ‘Adres Bilgisi Girilmemiş’ metninin de ilk 10 hanesini elde etmiş olduk.

Bu sorunu gidermek için yine ISNULL ile aynı işi yapan COALESCE fonksiyonunu kullanmalıyız.

SELECT AddressLine1,COALESCE(LEFT(AddressLine2,10),'Adres Bilgisi Girilmemiş') [AdressLine2] FROM Person.Address

Yukarıdaki kod parçası çalıştırıldığında istediğimiz sonucu elde etmiş olacağız.

Untitled3



27 Mart 2011 Pazar

SQL Temel Sorgu Örnekleri 1

Bu yazıda birkaç temel sql komutundan bahsedeceğiz. Kodlarımızı AdventureWorks veri tabanını kullanarak yazacağız.

İlk olarak metinlere göre yapılabilecek bazı sorgu şekillerini inceleyelim.

SELECT * FROM Person.Contact WHERE FirstName LIKE '%A%' -- Adının içinde 'A' harfi geçenler.

SELECT * FROM Person.Contact WHERE FirstName LIKE 'A%us%' -- Adı 'A' ile başlayıp, adında 'us' geçenler

SELECT * FROM Person.Contact WHERE FirstName LIKE 'A%' -- Adı 'A' harfi ile başlayan kayıtlar

 

SELECT * FROM Person.Contact WHERE FirstName LIKE '_b%' -- Adının ikinci harfi 'b' olan kayıtlar

 

SELECT * FROM Person.Contact WHERE FirstName LIKE '[A-E]%' -- Adının baş harfi A ile E arasında olan kayıtlar

 

SELECT * FROM Person.Contact WHERE FirstName LIKE '[^A-E]%' -- Adının baş harfi A ile E arasında olmayan kayıtlar

 

SELECT * FROM Person.Contact WHERE FirstName LIKE '[ABC][^k-z]%' -- Adının ilk harfi A B C olan ve ikinci harfi k ile z harfleri arasında olmayan kayıtlar. Burada her bir köşeli parantez, 1 karakteri temsil etmektedir.

Metinlerle kullanılan bazı fonksiyon örnekleri ;

SELECT RIGHT(Name,4) FROM Production.Product -- Ürün adlarının sağdan 4 hanesini getirir. Adı 'Mountain Bike' olan bir ürün için çıktımız 'Bike' şeklinde olacaktır.

 

SELECT LEFT(Name,4) FROM Production.Product -- Ürün adlarının soldan 4 hanesini getirir. Adı 'Chain Stays' olan bir ürün için çıktımız 'Chai' şeklinde olacaktır.

 

SELECT SUBSTRING(Name,3,5) FROM Production.Product -- Ürün adlarının 3.karakterinden itibaren 5 hanesini getirir. 1.parametre arama yapılacak olan metin, 2.parametre kaçıncı indexten başlanacağı, 3.parametre kaç karakter alınacağı.

--NOT : SQL'de index 1'den baþlar...

 

SELECT LEN(Name) FROM Production.Product -- Ürün adlarının karakter sayılarını getirir.

 

SELECT LTRIM('   DENEME') --Sol taraftaki boş karakterleri siler

 

SELECT RTRIM('   DENEME   ') -- Sağ taraftaki boş karakterleri siler

 

SELECT LTRIM(RTRIM('   DENEME   ')) --Trim ifadesinin kullanırken left veya right ile kullanmak zorundayız. Her iki taraftaki boşluğu silmek için bu tarz bir kullanım yapılabilir.

 

SELECT CHARINDEX('-',ProductNumber) FROM Production.Product --Ürün kodu içerisindeki '-' karakterinin index'ini getirir.

 

SELECT LOWER(FirstName),UPPER(LastName) FROM Person.Contact -- LOWER ile tüm harfler küçük olarak, UPPER ile tüm harfler büyük olarak gelir.

 

SELECT REPLACE('AL BU TAKATUKALARI','TAKATUKA','AYAKKABI') -- 1.parametre içerisinde işlem yapılacak ifadeyi, 2.parametre değiştirilmesi istenen metni, 3.parametre ise değiştirilmesi istenen metnin yerine geçmesini istediğimiz metni belirtir.. Burada takatuka yerine ayakkabı metninin gelmesini sağladık. Alacağımızz çıktı 'AL BU AYAKKABILARI' şeklinde olmalıdır.

 

SELECT REVERSE('DENEME') --Metni tersten yazdırır.

Tarihlerle kullanılan bazı fonksiyonlar;

SELECT GETDATE() -- Çalıştığı andaki tarih bilgisini getirir.

 

SELECT DAY(GETDATE()) -- Çalıştığı andaki tarihin gün bilgisini getirir.

 

SELECT MONTH(GETDATE()) -- Çalıştığı andaki tarihin ay bilgisini getirir.

 

SELECT YEAR(GETDATE()) -- Çalıştığı andaki tarihin yıl bilgisini getirir.

 

SELECT YEAR('2011-03-26') -- Verilen tarihin yıl bilgisini getirir. Çıktı: 2011

 

SELECT MONTH('2011-03-26') -- Verilen tarihin ay bilgisini getirir. Çıktı: 3

 

SELECT DATEPART(DW,GETDATE()) -- Çalıştığı andaki tarihin, haftanın kaçıncı günü olduğunu belirtir. NOT: Default standartlarda haftanın 1. günü pazar olarak kabul edilmektedir...

 

SELECT DATENAME(DW,GETDATE()) -- Çalıştığı andaki tarihin, gün adını belirtir.

 

SELECT DATENAME(MM,GETDATE()) -- Çalıştığı andaki tarihin, ay adını belirtir.

 

SELECT DATEADD(DD,1,GETDATE()) -- Çalıştığı andaki tarih bilgisine gün bazında 1 ekleyerek geriye döndürür. Örnek: 2001-01-22 tarihinde çalıştığını düşünürsek, alacağımız çıktı 2001-01-23 şeklinde olacaktır.

 

SELECT DATEDIFF(DD,'2000-01-01',GETDATE()) -- Çalıştığı andaki tarihten, '2000-01-01' tarihini çıkararak gün bazýnda farkını alır. (3.parametre - 2.parametre)

 



26 Mart 2011 Cumartesi

C# Anonim Metot

C# 2.0 ile gelen bir yeniliktir. Bir delege nesnesi oluşturulması esnasında, işaret edeceği metodunda aynı anda tanımlanmasıdır. C#’da metot içinde metot tanımlanmasının tek istisnai durumudur. Anonim metodun en önemli özelliklerinden birisi de, içerisine yazılmış olduğu metodun local değişkenlerini kullanabilmesidir.

Bir metot sadece anlık olarak işimize yarayacaksa o metodu ayrı bir isimle tanımlamak yerine, anonim olarak yazmayı tercih ederiz. Kullan-At tarzı metotları anonim olarak tasarlarız. Şimdi ufak bir örnek üzerinde inceleme yapalım.

namespace AnonimMetot

{

    delegate int Matematik(int sayi);

 

    class Program

    {

        static void Main(string[] args)

        {

            Matematik canta = KareAl;

        }

 

        static int KareAl(int x)

        {

            return x * x;

        }

    }

}

Yukarıdaki kod parçasında Matematik tipinden olan canta adlı delegemize KareAl adlı metodu bağladık. Bu metodun sadece tanımlandığı anda iş yaptığını düşünelim. Yani delegeye bağlanmak dışında başka bir görevi olmasın. Bu durumda uzun uzun KareAl adlı metot tanımlamak yerine, metodu anonim olarak tanımlamayı tercih ederiz.

namespace AnonimMetot

{

    delegate int Matematik(int sayi);

 

    class Program

    {

        static void Main(string[] args)

        {

            Matematik canta = delegate(int a)

            {

                return a * a;

            };

        }

    }

}

Bu şekilde metodu anonim olarak tanımlamış olduk.

Şimdi de framwork’de varolan Predicate adlı delege üzerinden bir koleksiyon içerisinde arama yapalım. Elimizde List<int> tipinden bir koleksiyon olsun. Bu koleksiyon içerisindeki çift sayıları filtreleyip ayrı bir listeye dolduralım.

static void Main(string[] args)

        {

            List<int> sayilar = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9 };

        }

Şimdi de sayilar degikeni üzerinden FindAll metodunu çağıralım.

Untitled

 

Dikkat ederseniz metot bizden Predicate<T> tipinden bir parametre istemekte. Predicate<T>, framework içerisinde varolan bir delegedir. Sayilar değişkenimizdeki T argumanı bir integer olduğundan, metot da bizden Predicate<int> tipinden bir parametre yollamamızı istemektedir. Bir metot parametre olarak bir delege istiyorsa bu, ‘bana bir metot gönder’ ile eş anlamlıdır. Predicate<int> delegesi üzerinden Go to definition dediğimizde, parametre olarak bir int alan ve geriye bool dönen bir imzaya sahip olduğunu görebiliriz. Bu da, parametre olarak integer alıp, geriye bool dönen bir metodu tutabileceği anlamına gelir.

Şimdi de filtrelemeyi yapacak metodu yazıp FindAll metoduna parametre olarak verelim.

class Program

    {

        static void Main(string[] args)

        {

            List<int> sayilar = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9 };

 

            List<int> ciftSayilar = sayilar.FindAll(CiftMi);

 

            foreach (int sayi in ciftSayilar)

                Console.WriteLine(sayi);

        }

 

        static bool CiftMi(int sayi)

        {

            return sayi % 2 == 0;

        }

    }

Yukarıdaki kod parçasını çalıştırdığımızda 2, 4, 6 ve 8 sayılarını ekranda görebiliriz.

Burada yazmış olduğumuz ‘CiftMi’ metodunu sadece FindAll metoduna parametre geçebilmek için tanımladık. Dolayısı ile bu metodu anonim olarak tanımlamamız daha temiz bir kodlama yapmamızı sağlayacaktır. Şimdi aynı örneği, metodu anonim olarak tasarlayarak yeniden yazalım.

class Program

    {

        static void Main(string[] args)

        {

            List<int> sayilar = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9 };

 

            List<int> ciftSayilar = sayilar.FindAll(delegate(int sayi)

            {

                return sayi % 2 == 0;

            });

 

            foreach (int sayi in ciftSayilar)

                Console.WriteLine(sayi);

        }

    }

Kodu çalıştırdığımızda yine ekranda 2, 4, 6 ve 8 sayılarını göreceğiz.



24 Mart 2011 Perşembe

C# Delegate Nedir?

5 temel tipten biri olan delegelerin kullanım amaçları, metot adresi saklamaktır. Bazen metotlarımızı, ihtiyacımız olduğu anda çalıştırmak isteyebiliriz. Olay(event) tabanlı programlama ve asenkron programlama yaparken, anonim metot yazarken delegelerden faydalanırız. Bir diğer kullanım amacı da, bir metoda parametre olarak başka bir metot verebilmektir. Bu yazımızda temel olarak delegenin ne olduğununu, nasıl tanımlandığını, nasıl kullanıldığını ve nasıl bir mantıkla çalıştığını inceleyeceğiz.

Delegeler referans türlü bir tiptir. Dolayısı ile nesneleri heap’de durur. Girişte bahsettiğimiz gibi, görevleri metot adresi tutmaktır. Burada dikkat edilmesi gereken nokta; delegenin imzası, tuttuğu metodun imzası ile aynı olmalıdır. İmzadan kastımız, geriye dönüş tipi ve aldığı parametrelerdir. Bir delege, birden fazla metot adresi tutabilir. Bu durumda FIFO (ilk giren ilk çıkar) prensibi geçerlidir. Yani metotlar, delegeye bağlanma sırasına göre çalışırlar. Sonuç almak istediğimiz zaman, en son eklenen metodun yaptığı işi görürüz.

Şimdi basit bir örnek ile anlatmak istediklerimizi incelemeye çalışalım.

namespace DelegeKavrami

{

    delegate void Temsilci(); //Tanımladığımız bu delege, geriye dönüş tipi void olan ve parametre almayan metotların adreslerini saklayabilir.

   

    class Program

    {

        static void Main(string[] args)

        {

            Temsilci t = new Temsilci(Test);

            t.Invoke();

        }

 

        static void Test()

        {

            Console.WriteLine("Metot çalıştı");

        }

    }

}

İlk olarak, adresini tutacağımız metodun imzasına uygun bir delege tanımladık. Daha sonra Main metodu içerisinde, delege nesnemizi oluşturduk ve constructor metoduna parametre olarak metodumuzun adını verdik. t değişkeni üzerinden invoke metodunu çağırdımızıda da metodumuzu çalıştırmış olduk. (metodumuz parametre alsaydı, invoke metoduna parametre değerlerini vermemiz gerekecekti.)

Untitled

 

Şimdi de bir delegeye birden fazla metot bağladığımızda nasıl bir sonuç alacağımızı incelemeye çalışalım.

namespace DelegeKavrami

{

    delegate int Matematik(int x);

   

    class Program

    {

        static void Main(string[] args)

        {

            Matematik canta = new Matematik(KareAl);

            canta += new Matematik(KupAl);

            Console.WriteLine(canta.Invoke(5));

        }

 

        static int KareAl(int sayi)

        {

            return sayi * sayi;

        }

 

        static int KupAl(int sayi)

        {

            return sayi * sayi * sayi;

        }

    }

}

Yukarıdaki kod parçasını çalıştırdığımızda alacağımız sonuç aşağıdaki gibidir.

Untitled2

Delegemize iki metot bağlamamıza rağmen, invoke metodunu çağırdığımızda en son eklenen metodun çalıştığını gördük.

Son olarak yazım kolaylıklarından bahsedelim.

1) Bir delegeye += ile metot ekleyebildiğimiz gibi, –= ile de metot çıkartabilmemiz mümkündür.

Matematik canta = new Matematik(KareAl);

canta += new Matematik(KupAl);

canta -= new Matematik(KupAl);

Bu aşamada delegemizi invoke ettiğimizde KareAl metodu çalışacaktır.

2) Delege nesnesi oluştururken, new …(..) yazmayabiliriz.

Matematik canta = KareAl;

canta += KupAl;

Console.WriteLine(canta.Invoke(5));

3) canta değişkeni üzerinden invoke etmek yerine, bu değişkene direkt olarak parametreleri verebiliriz.

Matematik canta = new Matematik(KareAl);

int sonuc = canta(5);