2 Nisan 2011 Cumartesi

C#'da Shared Assembly Oluşturmak

Assembly kısaca; kaynak kodun, derleyiciden cikmasiyla olusan dosyadir. Uzantisi iki farkli sekilde olur. dll yada exe'dir. dll, bilindiği gibi, projemize referans eder, içindeki hazır fonksiyonları, classları vs. kullanırız. exe ise, oluşturduğumuz uygulamanın çalışmasını sağlayan dosyaydı. Bu iki bilgi çok temel bilgidir fakat eksik şeyler var aslında burada. Öncelikle, .Net 2.0 ile birlikte 2005 yilindan sonra artik exe'ler de projeye referans edilmeye basladi. Peki bu dll,exe dosyaları nerede bulunur. Projemizin oluşturulduğu klasörü açtığımız zaman, bin klasörü içinde bulunan debug klasörünün içinde yer almaktadırlar dll ve exe. Aslında pdb uzantılı dosyalar da mevcuttur ama pek bilinmez ve kullanılmazlar. Yine de söylemek gerekirsek,  kısaca bu dosyalar da, debug yaparken bazı loglamaların saklandığı dosyalardır.

Bu bilgiler eşliğinde, şundan da kısaca bahsetmek gerekir. Bazı dll'ler, Visual Studio'yu ilk açtığımız andan itibaren kendiliğinden referans edilmiştir. Hatta biz onları references'dan silsek bile hata verilmez. Bunların dışında, kendi elle verdiğimiz dll'lerde mevcuttur. Tüm bu dll'ler .Net Framework içinde olabileceği gibi, daha sonradan oluşturulup, kullanılmak istenen dll'ler de olabilir.

İşte .Net dilinde, hazır framework içinde bulunan dll'lere Shared Assembly, Kendi yazdığımız,  sonradan oluşturulmuş dll'lere de Private Assembly denir. Private Assembly'ler kullanıldığı yerin yanında olmak zorundalar. Shared Assembly'ler için böyle bir zorunluluk yoktur. Yukarıda dediğim gibi, references'dan silsek bile o dll'i hata çıkarmaz. Bu dll'lere örnek verecek olursak, en başta System.Data dll'i gelir.

Shared Assembly'lerin bulunduğu/saklandığı yere GAC denir. Açılımı Global Assembly Cache'dir.

Şimdi biz de kendi yazdığımız dll'i(Private Assembly) Shared Assembly haline getirelim. Bunun için yapmamız gereken  ilk özellik, bu dll'e strong name (yani ona özgünlük sağlayacak) bir isim vermek olmalıdır. Bu isme de , projemize sağ tıklayıp properties dedikten sonra signing kısmından erişiyoruz.


Gördüğünüz gibi, mykey.snk isminde strong name oluşturdum.

Daha sonra da Visual Studio'nun Command Prompt ekranını açıp (Başlat-All Programs-Microsoft Visual Studio2010-Visual Studio Tools-Command Prompt) şu komutları yazmalıyız.



@@Identity,Scope_Identity() ve IdentCurrent

Sql'de insert vs. gibi işlemler yapılırken, elde edilen Id'yi veya değişiklik yapılan Id'yi tutmak isteriz. Yani Son işlem yapılan sorgunun id'sine erişmek isteyebiliriz. Özellikle Stored Procedure'lerde veya Triggerlarda yeni eklenen öğrencinin bilgilerini farklı sorguda kullanmak isteyeceğimiz zaman, bu öğrencinin id'sine ihtiyaç duyarız. İşte bu Id'yi yakalamanın yollarını ve birbirleriyle olan farklarını anlatmaya çalışacağım şimdi.

1-@@IDENTITY:

Son işlem yapılan sorgudan elde edilen Id'yi elde etmemizi sağlar. Aşağıdaki örnekte, insert yapıldıktan sonra ortaya çıkan Id şu şekilde bulunmuştur.

insert into Ogrenci values ('Ergin Arslan',81,12345)

(1 row(s) affected)

dedikten sonra aşağıdaki komutu çalıştırırsak, şu çıktıyı elde ederiz;


select @@IDENTITY


@@Identity'nin dezavantajı, Trigger içerisinde kullanılamamasıdır. Bu komut yerine daha çok Scope_Identity() kullanılır.

2-SCOPE_IDENTITY:

Yukarıda da bahsettiğimiz gibi, @@Identity'den farkı, triggerlar içerisinde kullanılabilmesidir. Ayrıca, @@Identity, herhangi bir scope'dan ve tablodan bağımsız çalışır. Scope_Identity, sadece bulunduğu scope'taki id sonucunu getirir. Trigger, StoredProcedure ... vs. işlemlerde kullanılabilir. En çok tercih edilen yöntemdir. Kullanılışı;

insert into Ogrenci values ('Ergin Arslan',81,12345)
select SCOPE_IDENTITY()


3-IDENT_CURRENT('TabloAdı'):

Parametre olarak aldığı tablodaki son işlem yapılan id'nin sonucunu getirir. Kullanılışı;

insert into Ogrenci values ('Ergin Arslan',81,12345)
select IDENT_CURRENT('Ogrenci')