30 Haziran 2008 Pazartesi

Sql Server Cursor

Sql server üzerinde stored procedure, trigger tarzı az kişi tarafından bilinen bir diğer T-SQL, cursor. Az kişi tarafından bilinmesi de herhalde pek tavsiye edilmiyor olması. Tavsiye edilmiyor olmasının sebebi de Sql server ı resmen sömürüyor. Sql server kurulumu ile gelen ve sql serverın çalışması için gerekli veritabanlarından biri olan tempdb yi çok fazla kullanıyor bu da serverın doğal olarak yavaşlamasına sebep oluyor. Bu yüzden tavsiye edilen eğer yapacağınız işlemi store procedure, SQL cümlecikleri vs.. ile yapabiliyorsanız kesinlikle cursor kullanmayın(tabi okulda hocalarınız özel olarak cursor oluşturmanızı istemediyse :)).
Cursorleri herhandi bir programlama dilindeki diziler üzerinde gezmek gibi düşünebiliriz, gezme işlemi yaparken üzerinde olduğumuz kaydı da değiştirebiliriz. Bu diziyi de select cümlesiyle oluşturuyoruz.
Cursorun genel yapısı şu şekilde
  DECLARE cursor_name CURSOR [ LOCAL | GLOBAL ]
[ FORWARD_ONLY | SCROLL ]
[ STATIC | KEYSET | DYNAMIC | FAST_FORWARD ]
[ READ_ONLY | SCROLL_LOCKS | OPTIMISTIC ]
[ TYPE_WARNING ]
FOR select_statement
[ FOR UPDATE [ OF column_name [ ,...n ] ] ]
Open cursor_name
.....
CLOSE cursor_name
DEALLOCATE cursor_name

Burada [a|b] arasındaki tanımlamaları istersek yazabiliriz yazarsak da sadece a veya b yazabiliriz. Her ikisini de yazarsanız hata alırsınız.
Tabi yazmazsak sql server bizim yerimize default olan değerleri koyacaktır. O yüzden cursorden tam olarak faydalanamayabiliriz.
Ben burada bir kaç tanesinin ne olduğundan bahsedeceğim bunlar önemli olanlar diğerlerine buradan bakabilirsiniz
Bu arada cursorde çok önemli bir ifade FETCH vardır bu kendisinden sonra gelen ifadeyle nereye dallanılacağını belirler.
LOCAL :Cursorun local olarak tanımlanması demek sadece kullanıldığı bağlantı içinde(stored procedure de tanımlanmışsa sadece o sp de kullanılabilir) görülecek demektir.Default olan değerdir eğer global veya local yazılmamışsa bu atanır
GLOBAL: Adından da anlaşılacağı üzere bütün bağlantılar tarafından görülebilen global bir cursor oluşturmuş oluruz.
FORWARD_ONLY: Bu bize cursor içinde sadece fetch next yapılacağını söyler. Tablonun baş satırından başlar sadece bir ileriye gidebiliriz.
SCROLL: Bu tanımlamayla bütün fetch işlemleri yapılabilir.
Diğerlerine de bakmanızı tavsiye ederim. Cursor üzerinde dolaşırken update yaptığınız zaman tablonuza yansıyıp yansımayacağı veya cursor açıldıktan sonra yeni veri girişi kabul edilmeyeceği gibi önemli şeyler var.
Tanımlanan fetch ler şunlardır.
FETCH FIRST: ilk kaydı fetch eder.
FETCH NEXT: bir sonraki kaydı fetch eder.
FETCH PRIOR: bir önceki satırı fetch eder.
FETCH LAST: en son satırı fetch eder.
FETCH ABSOLUTE n: n pozitif ise n. satır, n negatif ise sondan n. satır n=0 ise hiç bir satır fetch edilmez.
FETCH RELATIVE n: n pozitif ise en son fetch edilen satırdan n satır sonraki satırı fetch eder, n negatif ise fetch edilen satırdan n satır kadar önceki satırı fetch eder, n=0 ise fetch edilmez.
Bu arada fetch demek ilgili satırı alıp işlenir hale getirmek demek.
Bir örnekle bitireyim. Elimizde yazarlarla ilgili bir veritabanımız olsun. Girilen yazarın kitaplarını listeleyen bir stored procedure içinde cursor oluşturalım.

1. CREATE PROC yazarinKitaplari
2. @yazarAdi varchar(20)
3. AS
4. DECLARE @yazarKitap nvarchar(50)
5. DECLARE cursor_KitapListele CURSOR
6. LOCAL
7. SCROLL
8. FOR SELECT kitabi FROM yazar WHERE yazarAdi=@yazarAdi
9. OPEN cursor_KitapListele
10. FETCH LAST cursor_KitapListele INTO @yazarKitap
11. WHILE @@FETCH_STATUS=0
12. BEGIN
13. PRINT '@yazarAdi 'ın kitabı: @yazarKitap'
14. FETCH PRIOR cursor_KitapListele INTO @yazarKitap
15. END
16. CLOSE cursor_KitapListele
17. DEALLOCATE cursor_KitapListele

4. cursorden dönen kaydı bu parametreye geçireceğim eğer cursorde yazdığım select te 2 sütun dönseydi bana ona göre 2 değişken tanımlayıp fetch .. into dan sonra bu değişkenleri yazacaktım.
5. cursor bu şekilde tanımlanır.
8. cursorun üzerinde kayıt okuyacağı tablo bu select cümlesiyle geliyor.
9. cursor açılmalı, açılmazsa fetch işlemleri yapılmaz yani cursor bir işe yaramaz
10. son satırdan okumaya başladım kayıtları (fantazi yapıyom :)) okuduğum kaydı @yazarKitap değişkenine atıyorum.
11. @ fetch_status=0 demek fetch işleminin başarılı olması demek yani okunacak kayıt var.Okunacak kayıt varsa oku ve yazdır diyorum. fetch_status=-1 ise diğer kayda geçiş yapamamıştır yani satır sonu falan -2 ise öyle bir satır yok.
14. şu an son satırdayım bir önceki satıra gelip veriyi alıyorum bunu while ile en başa kadar yapıp kitapları yazdırıyorum.
16. açılan cursor mutlaka kapatılmalı ve
17. kullandığı kaynaklar bırakılmalı
Bu kadar yeter, bugün açıklanan veri tabanı dersinden geçmişim :D yoksa buraya küçük bir kitap yazardım valla. Bütünlemeye girecek arkadaşlara da kolay gelsin diyorum.

26 Haziran 2008 Perşembe

MCPD sınavları ve dökümanları

MCPD (Microsoft Certified Professionels Developers) Microsoft'un bazı sınavlarını geçmiş kişilere vermiş olduğu ünvan. En kısa zamanda hazırlanıp almak istediğim bir ünvan. Bu yüzden biraz baktım da hangi sınavları var nasıl ne zaman, burada onları yazacağım.
Microsoft'un bu sertifikasyon sınavları sadece bununla kısıtlı değil tabi. Mesela MCPD ye çok benzeyen MCTS(Microsoft Certified Technologist Specialist) farkı ise MCPD biraz daha karizma :) ve tabiki daha zor. Birinde sadece yazılım bilgi ile ilgili sorular gelirken diğerinde ise mimarisi hakkında sorular geliyor.
MCPD de verdiğimiz sınavlara göre 3 alanda isim alıyoruz. Bunlar
MCPD Windows Developer 3.5
MCPD ASP.net Developer 3.5
MCPD Enterprise Application Developer 3.5
Bunlar için verilen sınavlar da farklı tabi. Ben uzun uzun anlatmayacağım. Burada bu sertifikalar için gireceğimiz sınavlar yazıyor. Bunlar eski(.net 2.0 için) güncellememişler ama mantık aynı.
Bu sınavları bie de Microsoft'un ağzından dinleyin. http://www.microsoft.com/learning/mcp/mcpd/default.mspx
Burada sınavların geçmiş soruları tarzı dökümanlarını bulabilirsiniz. Buradaki sınavları görüntülemek için Visual CertExam lazım o da burada.

18 Haziran 2008 Çarşamba

Firefox ile sitede arama yapma

Firefoxun yeni bir özelliğini öğrendim ve gerçekten çok hoş bir özellik bunu da burada paylaşmak istedim. Her geçen gün yeni bir şeyler çıkıyor valla
Sitede arama yapmak için siteye girer ve arama textBox ına anahtar kelimeyi yazıp ara butonuna basarız. İşte firefox bunları bizim için yapıyor. Herhangi bir sitede arama yapılan textBox üzerine sağ tıklayarak arama için anahtar kelime ekle diyoruz, sonra anahtar kelime yerine de hatırlayabileceğimiz kolay bir şey giriyoruz.
Bir örnek örneğin www.seslisozluk.com için yapacağım. Siteye girip kelimeyi yazıp arama yapmak yerine yukarıda anlattıklarımı yapıyorum anahtar kelime yerine de s yazıyorum.
ingilizce hibernate kelimesini aratacağım yapmam gereken firefox u açıp adres çubuğuna s hibernate yazıp entera basmak direkt kelimenin türkçe çevirisi gelecek.
Firefox için forumlarda özel bir bölüm açmalılar bence millet bildiklerini yazar böylece interneti kullanma hızımız artar ve firefoxun bütün fonksiyonlarından yararlanabiliriz.

4 Haziran 2008 Çarşamba

IBM staj sınavı

Evet dün IBM in bilenler vardır staja kabul etmeden önce yaptığı bir sınav vardır ona girmiş bulunuyorum. Kısaca bir açıklayayım dedim.
IBM internet üzerinden staj başvurusu yaptırıyor daha sonra da bu başvurulardan uygun gördüğü bir çok kişiyi staj için bir sınava çağırıyor bir çok kişi dedim çünkü 1000 kişi falan giriyor herhalde.
Yalnız bu sınavla stajyer alıp ne işe yarayacağını anlamış değilim. Başvuruken çalışmak istediğimiz projeleri belirtiyoruz sınavda şekille falan uğraşıyoruz acaba projelerde de bizlere paint ile şekil falan mı çizdirecekler de şekil algılama kapasitemizi yükseltiyorlar :D Tabi bilmiyoruz onların bileceği iş işe yarıyor ki her sene bu şekilde stajyer alıyorlar.
Gelelim sınava sınav 3 part halinde toplam 95 soru.
1. part tamamen alfabedeki harflerle ilgili sıradaki ne olur cinsindendi ve toplam 40 soru.
2. part şekiller var onların içinde de şekiller var böyle karmaşık bir şeyler yine bunlardan sonra ne gelir şeklinde ve toplam 30 soru.
son bölüm ise 25 soruluk matematik soruları işte ÖSS den bilinen problem tarzı sorular. Tavsiye edilen zaman kullanımı ise sırasıyla 15,15 ve 30 dk. Bu arada sorular ingilizce tabi.
İşte sınav kısaca bunlardan ibaret bu arada sınav sonrası oradaki görevlilere sordum "Elimizdeki projelere göre stajyer alıyoruz sayısı her sene değişiyor geçen sene 250 kadar kişi aldık bu sene elimizdeki projeler az o yüzden 100'e yakın kişi alacağız." dediler. Sınav sonuçları da 10 gün içerisinde açıklanacakmış. Hadi bakalım hayırlısı.
Bilginiz olsun diye ....

28 Mayıs 2008 Çarşamba

Microsoft Employee blogs

Evet bizlere bu kadar yenilikleri çıkartıp her geçen gün kod yazmayı daha kolay , anlaşılır ve zevkli hale getiriyorlar. Her zaman merak etmişimdir bunlar kimler diye msdn sitesinden bulduğum bazı developer lar ve bunların blog adreslerini paylaşmak istedim.
Bu arada .net ile proje geliştiren arkadaşlar msdn sitesini kullanın gerçekten bence microsoftun yapmış olduğu en iyi site. Her türlü kodların kullanımı ile ilgili bir sürü örnek kodlar mevcut.
Öncelikle Microsoft un developer bölümünün başı olan S. Somasegar ile başlamak istiyorum. Microsoftta nelerden sorumlu diye bakarsanız neredeyse kullandığımız microsoft ürünlerinden sorumlu. Adam hiç uyumuyordur herhalde Bill Gates den fazla işi varmış :D
S. Somasegar ile ilgili bilgilere buradan kendisiyle yapılan bir röportaja buradan
kendisinin bloğuna da S. Somasegar ulaşabilirisiniz
Scott Guthrie. Benim diğerlerine göre biraz daha tanıdığım ve çoğu kimsenin bildiği ve takip ettiği ASP.net developer larından bir isim.
Sara Ford. Adventures in sharing Microsoft source code.
Raymond Chen. Raymond Chen's blog focuses on practical development throughout the evolution of Windows.
Jensen Harris. An Office User Interface Blog by the Group Program Manager of the Microsoft Office User Experience Team.
Rob Mauceri. Learn about what's coming in Microsoft Office SharePoint Designer 2007 and Expression Web Designer.
Brad Adams. Design Guidelines, Managed code and the .NET Framework.
Michael Howard. A Simple Software Security Guy at Microsoft!
J.D. Meier. Software Engineering. Project Management. Effectiveness.
Ayrıca bir kaç blogu daha ekleyeyim.
Outlook Internet Explorer ve Windows Mobile

25 Mayıs 2008 Pazar

C# harddiske veri kaydetme

C# ta listView , listBox veya bunlara benzer kontrollerdeki veriler kolayca harddiske kaydedilir böylece uygulamanın tekrar açılışında veri kaybını önlemiş oluruz. İlk önce kaydedeceğimiz veriler bir class içinden alınıyorsa bu class a bi attribute eklememiz gerekiyor. class tanımlamadan önce namespace tanımlamasından sonra [Serializable] ekliyoruz.
Kullancağım değişkeni önce beilirteyim kisiler diye bir class tipinde dizi değişkenimiz var ve kaydetmek istediğimiz veriler bunun içinde olsun.
System.IO namespace altında tanımlanan özellikleri kullanacağız bu yüzden projenize bunu eklemeyi unutmayın.
Bir buton sayesinde kaydetme işlemi yapacağız. Buton click event ine aşağıdaki kodları yazmamız gerekiyor.
FileStream fs = new FileStream("Fihrist.bak", FileMode.Create);
BinaryFormatter bf = new BinaryFormatter();
bf.Serialize(fs, kisiler);
fs.Close();
MessageBox.Show("Kaydedildi");

FileStream bize dosyayı istediğimiz yerde oluşturup onu ne yapacağımızı bildirdiğimiz kısımdır. Burada
FileStream("Fihrist.bak", FileMode.Create); FileStream e verilen ilk parametre dosyayı kaydedeceğimiz yerdir. C:/Fihrist.bak şeklinde yazarsak C'nin altına kaydedecektir sadece ismini yazarsak bizim projemizde bulunan bin dosyasının altındaki Debug klasörünün altına kaydedecektir. İstediğimiz ismi ve uzantıyı verebiliriz. Burada FileMode ile ise bu yeni bir dosya oluşturacağımızı söylüyoruz. İstersek var olan dosyayı da açabiliriz.
Dosyayı kullandıktan sonra kapatmayı unutmayın yoksa açık kalır :D
BinaryFormatter asıl işi yapar verimizi Serialize metodu sayesinde dosyaya binary halinde kaydeder. İşte bu kadar...
Daha sonra diyelim bu dosyadaki verileri açıp gereken yere koymak istiyoruz. O zaman şunları da Formun Load event ine yazın
FileInfo fInfo = new FileInfo("Fihrist.bak");
if (fInfo.Exists)
{
FileStream fs = new FileStream("Fihrist.bak", FileMode.Open);
BinaryFormatter bf = new BinaryFormatter();
kisiler = bf.Deserialize(fs) as List;
fs.Close();
Listele();
}

Buradaki Listele() metodu benim verilerimi ListView e yazmaya yarıyor. Fazla uzatmayayım en kısa bu kadar oldu.

22 Mayıs 2008 Perşembe

Stored Procedure tanımlamaları

Örnek olarak basit stored procedure tanımlamaları:

->En genel stored procedure
CREATE PROCEDURE procedure
AS
SELECT * FROM tablo_adi
GO çalıştırmak için (EXEC procedure)

->Parametre alan store procedure tanımlamaları
CREATE PROCEDURE procedure
@yas int
AS
SELECT * FROM tablo_adi WHERE yas>@yas
GO (EXEC procedure 20)

->Kendi içerisinde değer kullanan stored procedure
CREATE procedure [dbo].[ilkStoredProcedure]
@name varchar(10)
AS
DECLARE @name2 nchar(10)
SET @name2=(SELECT ad FROM genel WHERE ad=@name)
IF @name2 is null
BEGIN
insert into genel(ad) values(@name)
END
ELSE
PRINT 'Bu isimde database de kullanıcı adı var'
GO (EXEC procedure ahmet)