SQL Server Execution Plan Mimarisi Kitabımız Yayınlandı!!!

SQL Server ile çalışırken dikkat ettiğimiz en önemli konulardan biri SQL Server’da çalıştırdığımız sorguların performansıdır. Yazdığımız sorguların performanslı bir şekilde çalışması bizler için oldukça önem arz etmektedir. Bu nedenle çoğu uygulama geliştirici ve veritabanı yöneticisi tarafından çalıştırılan sorguların hangi çalıştırılma yöntemini kullanarak işleme alındığını incelemek ve buna uygun müdahalelerde bulunmak gerekebilir. İşte bu nedenle SQL Server’ın bir sorguyu nasıl çalıştıracağının veya nasıl çalıştırdığının yöntemi Execution Plan olarak bilinmektedir. Bu kitabımızda SQL Server’a ait Execution Plan Mimarisi’ni detaylı olarak ele aldık. Kitabın yazılmasında hem arkadaşım hem de meslektaşım olan İsmail Adar ile birlikte rol almak benim için büyük bir keyifti. Umarım okurken sizler de aynı keyfi alırsınız…

 Kitabı aşağıdaki linkten indirebilirsiniz. Keyifli okumalar…

SQL Server Execution Plan Kitabı

kitap kapak

DLL Oluşturulması ve DLL Kullanımı

Visual Studio kullanarak uygulama geliştirirken bazı durumlarda kaynak kodlarımıza DLL (Dynamic Link Library) dosyalarını referans olarak eklemek isteyebiliriz. Bazı durumlarda hazır oluşturulmuş kütüphaneleri (dll) eklemek gerekli olabilirken, bazı durumlarda ise kendi dll dosyamızı oluşturup daha sonra bu kütüphane dosyamızı diğer projelere referans olarak ekleyip kullanmak isteyebiliriz. Bu yazımızda sizlere basit bir dll dosyasının nasıl oluşturulacağını  ve diğer projelerimize bu dll dosyasının nasıl referans edilerek kullanıma alınacağını resimlerle görselleştirerek aktarmaya çalışacağım.

Öncelikle dll dosyası oluşturabilmek için Visual Studio ortamında yeni proje açma ekranından “Class Library” templete ini seçiyoruz ve oluşturacağımız dll dosyamıza bir isim veriyoruz. Örneğimizde OgrenciLibrary isminde bir dll oluşturuyoruz.

ProjectDll

Karşımıza gelen ekranda standart bir class yapısı mevcut durumda ve biz bu classın adını Ogrenci olarak değiştiriyoruz. Daha sonra bu sınıfa ait property (özellik) leri tanımlıyoruz. Burada tanımladığımız Ad, Soyad ve Yas isimli property ler dll oluşturulduktan sonra diğer projelerde kullanılırken karşımıza çıkacaktır. Gerekli tanımlamaları yaptıktan sonra projeyi F6 ile derliyoruz.

OgrenciBase

Class Library projesini F6 ile build ettikten sonra dll dosyasının oluşturulduğunu kontrol edelim. Bunun için projemizin oluşturulduğu dosya yolundaki Bin\Debug klasörü altına bakalım.

Ogrenci1

Gördüğünüz gibi OgrenciLibrary ismindeki dll dosyamız oluşturulmuş durumda. Şimdi bizim oluşturduğumuz bu dll dosyasını başka bir projemize nasıl ekleyeceğiz ve kullanacağız inceleyelim.

Oluşturulan dll dosyasını kullanmak için yeni bir proje açıyoruz. Biz şu an için var olan solution üzerine sağ tıklayarak add ==> new project ile yeni bir console uygulaması açıyoruz.

Screenshot (2)

Şimdi sıra açılan yeni console projesine daha önce oluşturulan dll dosyasını referans etmeye (eklemeye) geldi. Bunun için yeni açılan projede Solution Explorer penceresindeki Referance isimli sekmede sağ tıklayarak referans ekleme penceresine geliyoruz.

Screenshot (1)

Açılan referans ekleme penceresinden oluşturduğumuz dll dosyasını veya başka bir yerden temin ettiğimiz diğer dll dosyasını seçiyoruz ve OK diyerek dll dosyasını projemize ekliyoruz.

Referans1

Bu işlemin ardından References bölümünün altında eklediğimiz OgrenciLibrary ismindeki dll dosyamız gözüküyor ve projemize dahil etmiş oluyoruz. Daha sonra eklenen dll i using ile kullanıma alıyoruz.

Screenshot (3)

Artık projemize oluşturulan dll dosyası eklenmiş durumda ve yeni projemizde dll içerinde bulunan Ogrenci classını ve buna ait Ad, Soyad ve Yas isimli property leri kullanabiliriz. Bununla beraber yeni projemize ait dosya yolundaki Bin\Debug klasörüne bakarsak OgrenciLibrary ismindeki dll dosyasının buraya eklenmiş olduğunu göreceksiniz.

OgrenciKlasor

Yeni uygulamamızda dll e ait Ogrenci sınıfının property lerine değerler vererek ekrana yazdıralım. Örnek olarak Ad için Abdullah, Soyad için ALTINTAŞ ve Yas için ise 26 değerlerini atayalım ve bu değerleri ekrana yazdıralım.

DllKullanim

Son olarak projemizi derleyip çalıştıralım ve sonucu hep beraber görelim:

DLLSon

Gördüğünüz gibi kendi oluşturduğumuz dll dosyasını başka bir projeye referans ettik ve bu dosyadaki Ogrenci ismindeki sınıfı ve elemanlarını kullandık. Kendi oluşturduğumuz dll dosyaları gibi başka yerlerden temin edebileceğimiz diğer dll dosyalarını da projelerimize referans olarak ekleyip kullanabiliriz.

Konuyla ilgili soru, görüş ve önerilerinizi bana bildirirseniz çok sevinirim. Yorumlarınızı bekliyorum. Bir başka yazıda görüşmek üzere…

Yazar: Abdullah ALTINTAŞ

Crystal Report ve Report Viewer Hatası

Visual Studio kullanarak oluşturduğumuz projelerde genelde raporlama gereksinimine sıklıkla ihtiyaç duymaktayız. Bu gibi durumlarda genelde Visual Studio ile birlikte gelen Report Viewer tool u ve SAP tarafından sunulan ve projemize ekleyebileceğimiz Crsytal Report bize verilerimizi rapor haline getirmemizde yardımcı olurlar. Fakat proje ister web tabanlı bir ASP.NET projesi olsun isterse Windows Forms projesi olsun bazı durumlarda verileri rapor haline getirmek sıkıntılı olabiliyor. Bu gibi durumlarda karşımıza çıkan bir hata mesajı üzerinden ne yapmamız gerektiği konusunda biraz bilgi verelim.

The source of the report definition has not been specified

The source of the report definition has not been specified

Genelde projemiz ister C# ile ister VB.Net ile geliştirilmiş olsun Report Viewer kontrolünü Toolbox pencesinden Reporting tabı altından ekledikten sonra ReportViewer kontrolü üzerindeki smart tag kullanılarak bu raporlama aracına uygun bir şekilde veri bind etmek gerekir. Eğer verileri veritabanından uygun bir şekilde getirip bu kontrole bağlayamazsak programımız çalışma esnasında “The source of the report definition has not been specified” tarzında bir mesaj ile karşımıza çıkacaktır. Verilerin gösterilmesi gerekirken bu uyarıyı raporlama ekranında görmemizin ilk muhtemel nedeni yukarıda bahsedildiği üzere verileri doğru bir şekilde bind edememiş olmamızdır.

Peki verileri doğru bir şekilde bind etmemize rağmen projeyi local makinede çalıştırdığımızda sorun çıkmadan raporlara ulaşmamıza rağmen uygulamayı başka bir bilgisayarda çalıştırdığımızda veya server üzerinde yayınlamamıza rağmen başka bilgisayarlarda yine raporlara ulaşamamamız durumunda yine yukarıdaki gibi “The source of the report definition has not been specified” türünde bir ekran ile karşılaşabiliriz. Bu sorunun muhtemel sebeplerinden birisi lokal makinemizde CrystalReportViewer ve ReportViewer kontrollerinin çalışabilmesi için ilgili kurulumun daha önceden yapılmış olmasına rağmen serverda veya başka bir makinada raporların gösterilmesini sağlayacak CrystalReportViewer ve ReportViewer için gerekli kurulumun yapılmamış olmasıdır. Böyle bir durumda server veya uygulamanın çalıştırılacağı bilgisayara aşağıdaki linkte verilen adresten uygun olan uygulamanın indirilip kurulması gerekmektedir.

64 Bit;

http://scn.sap.com/docs/DOC-7824 linklerden MSI 64 Bit oaln seçilmeli,

http://downloads.businessobjects.com/akdlm/cr4vs2010/CRforVS_redist_install_64bit_13_0_4.zip

32 Bit;

http://scn.sap.com/docs/DOC-7824 linklerden MSI 32 Bit oaln seçilmeli,

http://downloads.businessobjects.com/akdlm/cr4vs2010/CRforVS_redist_install_32bit_13_0_4.zip

Uygulamanın çalıştırılacağı bilgisayara bu kurulumlar yapıldıktan sonra raporlarınızın sorunsuz bir şekilde ekrana geleceğini göreceksiniz. Hepinize iyi kodlamalar…

Yazar: Abdullah ALTINTAŞ

Property Kavramı ve Erişim Belirleyiciler (Access Modifiers)

Hangi programlama dilini kullanırsak kullanalım programımızda yer vereceğimiz öğelere bir erişim yetkisi ve kısıtlaması eklemek bazen kaçınılmaz oluyor. Programımızdaki bu öğeler class, interface, delegate, enum, struct, metot, değişken vs. olabilir. C# dilini kullanarak kodlama yapacak olan bir yazılımcı için de bu hususta belirli erişim belirleyici anahtar kelimeler (keywords) mevcuttur. Programımızda yer alan öğelere bu erişim belirleyicileri ön ek olarak ekleyerek erişimlerini kısıtlayabiliriz. Microsoft tarafından C# dili için bize sunulan bu erişim belirleyici (access modifiers) anahtar kelimeler şunlardır:

  • public
  • private
  • protected
  • internal
  • protected internal

Yukarıda belirttiğimiz bu erişim belirleyicileri kısaca açıklamak gerekirse; “public” programdaki öğeye heryerden erişim yetkisi verir, “private” ilgili öğeye sadece tanımlandığı yerden (örneğin class içinden) erişim yetkisi verilir, “protected” ile işaretlenmiş öğeye sadece türetilmiş (inherit edilmiş) class içerisinden erişilebilir, “internal” ile belirlenen öğeye sadece ilgili assembly (uygulama) içerisinden erişilebilir ve bu öğeye uygulama dışından erişim engellenmiş olunur ve son olarak da “protected internal” erişim belirleyicisi protected ve internal belirleyicilerinden herhangi birisinin şartları sağlanmışsa yani öğeye tanımlandığı class içerisinden veya türetilmiş classlar içerisinden ya da aynı assembly içerisinden erişilebilir.

C# ta class ve struct lar için bir erişim belirleyicisi belirtilmez ise varsayılan olarak internal tanımlıdır, aynı zamanda class seviyesinde tanımlanan öğeler de (değişken, metot gibi) yine varsayılan olarak private erişim belirleyicisi ile tanımlanırlar. Burada bir noktayı belirtmekte fayda vardır; struct lar türetmeye girmedikleri ve desteklemedikleri için struct içerisindeki öğeler protected ve protected internal erişim belirleyicilerini alamazlar.

Şimdi yukarıda bahsettiğimiz erişim belirleyicilerinden bazılarına küçük örnekler vererek konuyu pekiştirelim. Örneğin aynı assembly içerisinde tanımlanmış iki class içerisindeki öğelere erişimi inceleyeceğiz:

Programımız içerisinde bir adet Sample isimli class oluşturup içerisine “metin” isimli private değişken ile “erisilenMetin” isimli bir de public değişken tanımlandı. Ayrıca “urunID” isimli bir değişken daha oluşturulmuş olup dikkat edilirse herhangi bir erişim belirleyici verilmemiştir. Yukarıda belirtildiği gibi bu değişken varsayılan olarak zaten private tır. “urunID” isimli değişken için ayrıca “UrunID” isimli bir property (özellik) oluşturulmuştur. Property oluşturabilmek için kursor private tanımlı değişken isminin üzerinde odaklanmış iken ctrl+r+e tuş kombinasyonuna sırasıyla basarak property oluşturma ekranına gelinir. Burada oluşturulacak property için bir ayar yapılmayacaksa ilgili sayfalar enter ile geçilir ve private değişkenimiz için property oluşturulmuş olur. Tabi istenirse bu işlem kod yazarak programcı tarafından da yapılabilirdi. Burada dikkat edilmesi gereken nokta değişken private iken oluşturulan property public erişim belirleyicisini alır. Bunun nedeni bu değişken için değer atama ve ilgili değerini alma gibi işlemler için bir kriter uygulanmak isteniyorsa ilgili property nin get ve set bloklarında bu işlemler yapılmalıdır. “get” bloğu değişkene atanan değeri elde etmek için kullanılır ve return anahtar kelimesi ile bu değeri programa döndürür. “set” bloğu ise değişkene değer atamak için kullanılır. Property konusunu kısaca açıkladıktan sonra örneğimize dönelim. Sample sınıfında tanımladığımız değişkenler ve property e erişim için Program isimli classımızın Main adlı metodunda Sample classımızı new ile örnekliyoruz ve bu classa ait “deneme” isimli bir nesne oluşturuyoruz. Daha sonra oluşturduğumuz “deneme” isimli nesne üzerinden Sample classı öğelerine erişmeye çalışıyoruz. Ekranda görüldüğü gibi private tanımlanmış öğelere erişilemez iken sadece public tanımlı “erisilenMetin” isimli değişkenimiz ile beraber “UrunID” ismli public tanımlı Property e erişebilmekteyiz.

Son olarak property kavramına dönecek olursak onunla ilgili de küçük bir örnek ile konuyu tamamlayalım:

Burada “UrunID” isimli property için değer ataması yapılırken set blogu içerisinde tanımladığımız eğer sıfırdan küçük bir değer atanırsa atanan değerin sıfıra eşit olmasını yok eğer atanan değer sıfırdan büyük ise o zaman atanan değerin olduğu gibi atanmasını sağlıyoruz. İlk etapta “UrunID” ye -5 değeri atanmış ve sonuç ekrana yazdırılmıştır. Görüldüğü gibi -5 değeri atanmaya çalışılsa bile atanan değer negatif olduğu için sıfıra eşitlenmiştir. İkinci durumda ise bu sefer 3 gibi pozitif bir sayı ataması yapılmış ve yine ekrana yazdırılmıştır. Bu durumda 3 değerinin atandığı ekrandan görülmektedir.

Yazar: Abdullah ALTINTAŞ

Partial Class Kavramı

C# programlarımızda bazı sınıf (class) lar çok fazla sayıda sınıf elemanına sahip olabilir. Özellikle büyük projelerde sınıfların karışık yapıda olmasını engellemek için sınıfı belirli parçalara bölmek daha mantıklı bir yol olacaktır. Böylece sınıfın ve projenin görünümü ve yönetimi daha kolay bir hal alacaktır. İşte bu yüzden büyük sınıflarımızı C# taki “partial” anahtar kelimesi yardımıyla parçalara bölebiliriz. Bunu yapabilmek için parçaya ayırdığımız class ın başına “partial” eklememiz yeterli olacaktır.

Aşağıdaki örneğimizde bir adet sınıfımızı mantıklı olacak bir şekilde özellikleri(properties) bir parçada, metotları(methods) da ayrı bir parçada tutarak class ın karışık bir yapıda olması önlenmiş olur ve yönetimi kolaylaşır.

Görsel

Burada “Sinif” adlı class ımız partial anahtar kelimesi ile bölümlenmiş ve class a ait değişkenler bu parçada tanımlanmışlardır.

Görsel

Burada ise yine aynı class a ait metotlar bu sefer farklı bir parçada tutularak özellikler ile birbirine karışması engellenmiş olur.

Partial class kavramı WindowsForms uygulamalarında da karşımıza çıkmaktadır. Formun designer bölümü bir parçada kodlama bölümü ise ayrı bir parçada tutularak programcıya kolaylık sağlanmıştır. Her ne kadar sınıfımız parçaya ayrılmış gibi görünse de program çalıştırıldığında class ımız tek class gibi hareket edecek ve parçaya ayrılmış olan kodlarımız derlenip program tarafından bir bütün olarak çalıştırılacaktır.

Yazar: Abdullah ALTINTAŞ