Using Kullanımı ve Otomatik Dispose()

Merhaba;
Bu makalemizde Using ifadesi kullanımı, nasıl çalıştığını ve bellek yönetimine katkısını incelemeye çalışacagız.

Yazılımda performans ve bellek yönetiminin önemini biliyoruz. Küçük çaplı projelerde .Net CLR (Common Language RunTime) sayesinde kodları çalıştırmak
ve bellek yönetimini otomatik olarak yapma görevini üstlensede büyük çaplı, verilerin yoğun aktığı bir projede bellek yönetimini mümkün olduğu kadar elimizde tutmamız gerekir. CLR de bu görevi GC (Garbage Collector) mekanızması sayesinde yerine getirmektedir.

Bilindiği gibi kod tarafında oluşturulan referans tipler için bellekte heap bölgesinde alan tahsis edilir ve işi bittikden sonra bellekten atılırlar ama bellekten atılma süreleri belirsizdir.

Belirsiz dedik çünkü GC nin ne zaman çalışacağı belli değildir. (Kendi içinde mutlaka bir mekanizmaya bağlıdır.)

Direk şu fikir akla gelebilir ozaman bizde GC yi görev başına çagırırız! Evet bu da bir yöntem ama sadece gerçekten gerektiğinde kullanılması gerekir. Çünkü sık sık GC kullanmak performans kaybına neden olur.

Ayrıca oluşturulan nesnelere null değeri atamak o nesneyi bellekten atmaz sadece üzeri kapatılarak erişilmez hale getirir ama arka tarafta bellek alanında var olmaya devam eder.

Ozaman ne yapılmalı ?
IDispose arayüzünden implemente edilmiş Dispose() metodu kullanmalı.

Kullandığımız bir çok nesne Dispose() metoduna sahiptir ve tamamıda IDispose interface inde kalıtım yoluyla geçmiştir.

İsterseniz şimdi kısa bi örnek ile ilerleyelim.

SqlConnection sqlCon = null;
SqlDataAdapter adp = null;
try
{
sqlCon = new SqlConnection("Server=.;Database=AdventureWorks;Uid=sa;Pwd=1234");
adp = new SqlDataAdapter("Select * From Production.Product", sqlCon);
adp.Fill(dt);
}
catch (Exception ex)
{
throw new Exception ("hata", ex);
}
finally
{
sqlCon.Close();
adp.Dispose();
sqlCon.Dispose();
}

Görüldüğü gibi finally blogu her durumda çalışağı için SqlDataAdapter ve SqlConnection nesneleri Dispose işlemine tabi tutulmuşlardır.

Buraya kadar anladık ama using bunun neresinde diyebilirsiniz. Şimdi sıra bunun cevabını vermeye geldi.

using anahtarı uyğuladıgınız sınıflarda otomatik olarak dispose çalıştırır.
Yani bunun anlamı finaly blogunda ayrıca adp.Dispose(); şeklinde metoduğu çagırmanıza gerek kalmaz using bizim için bunu yapar demektir.

usin ifadesi nesnenin yaşam sürecini belirtir.

using(SqlCommand cmd=new SqlCommand("Select * From Production.Product", sqlCon))
{
// işlenen komutlar
// SqlCommand yaşam alanı
}

Örnekte bakacak olursak SqlCommand yaşam alanı { } arasında son bulacaktır. Otomatik olarak Dipose() uygulanmış olur.

Çok kullanıcılı bir programda bunun ne kadar önemli oldugunu tahmin edersiniz.

Sizlerde geliştirdiğiniz sınıflara aşagıda ki örnegi uygulayarak usin ifadesiyle otomatik dispose a tabi tutabilirsiniz.

class MyClass:IDisposable
{

public void Dispose()
{
//Dispose kodlarınız...
GC.SuppressFinalize(this);
}
}


Umarım faydalı olmuştur...

Sql String Fonksiyonları

Merhabalar bu makalemizde sıkca kullandığımız Ms Sql string ifadeleri bir araya toplayarak
ne işe yaradıklarını birer örnekle kısaca anlatmak istedim.

Sql tarafında işleri ne kadar iyi çözümlersek yazılım dilleri trafında kodlar o kadar sadeleşiyor ve olası basit değişiklikler söz konusu olduğunda maliyeti oldukca düşürüyor.

LEFT String ifadeden soldan verilen sayı kadarını gösterir.
SELECT LEFT('ŞEBNEM FERAH',3)
Sonuç:ŞEB

RIGHT Stringten sağdan verilen sayı kadarını gösterir.
SELECT RIGHT('ŞEBNEM FERAH',5)
Sonuç:FERAH

LEN Verilen stringin karakter sayısını döndürür. Buna boşluk karakteride dahildir.
SELECT LEN('ŞEBNEM FERAH')
Sonuç:12

UPPER Küçük harfli verilen stringi büyük harflere çevirir.
SELECT UPPER('fatih')
Sonuc: FATİH

LOWER Büyük harfli verilen stringi küçük harflere çevirir.
SELECT LOWER('FATİH')
Sonuç: Fatih

SUBSTRING Verilen stringten parça almak için kullanılır.
Örnekte verilen parametrelere göre 2 den başlayrak 3 tane karakter al demiş olduk.
SELECT SUBSTRING('FATİH',2,3)
Sonuç: ATİ

REPLACE Verilen karakterleri biribiriyle değiştirir.
Örnekte MAKİNİST kelimelerini PİLOT olarak değiştir dedimiş olduk.
SELECT REPLACE('MAKİNİST AHMET','MAKİNİST','PİLOT')
Sonuç:PİLOT AHMET

STUFF 4 paremetre olarak çalışan bu fonksiyon replace fonksiyonu gibi çalışır ama fark olarak karakter olarak değil verilen indexlere göre değiştirme yapar.
SELECT STUFF('Audi hh',5,3,'TT')
Sonuç:AudiTT

LTRIM Soldan boşlukları alır.
SELECT LTRIM(' RAMBO')
Sonuç:RAMBO

RTRIM Sağdan boşlukları alır.
SELECT RTRIM('RAMBO ')
Sonuç:RAMBO

REVERSE stringi ters çevirir.
SELECT REVERSE('RAMBO')
Sonuç:OBMAR

QUOTENAME Verilen string ifadeyi köşeli parantez [] içine almayı sağlar.
SELECT QUOTENAME ('SELECT')
Sonuç:[SELECT]

REPLICATE Verilen string ifadeyi parametre geçilen sayı kadar tekrarlar.
SELECT REPLICATE('0',10)
Sonuç:0000000000

Faydalı olması umuduyla...

SQL Procedure ile Excel den Sql e Aktarımı

Arkadaşlar bu makalemizde SQL Proc ile excel den sql e SQL veri aktarımını incelicez.

Bir çok konuda oldugu gibi bu konuda da bi kaç farklı yöntem uygulanabilir.
Benim ihtiyacım olduduğunda kullandığım yöntemi sizinle paylaşmak istedim.

OPENROWSET teknigini kullanmak için sql serverinizde ikitane servisin aktif halde olması gerekiyor bunlar 'show advanced options' ve 'Ad Hoc Distributed Queries' servisleridir.

Aşagıda gördüğünüz komutları sql çalıştırırak yada Menüden SQL SERVER 2005/Configration Tools altından resimde gödüğünüz gibi tik işaretli olması gerekiyor.



sp_configure 'show advanced options', 1
reconfigure
go
sp_configure 'Ad Hoc Distributed Queries', 1
reconfigure

Ayarlarımızı yaptıktan sonra sıra geldi proceduremizi yazamaya.

CREATE PROC XLS_AKTARIM
ASDECLARE @KOMUT NVARCHAR(500)
SET @KOMUT='SELECT * INTO Sayfa1$ FROM OPENROWSET(''Microsoft.Jet.OLEDB.4.0'',''Excel 8.0;Database=C:\test.xls'', [Sayfa1$])'
EXEC( @KOMUT)

Sonuç olarak açıklamamız gerekirse ;
OPENROWSET yöntemini kullanarak Microsoft.Jet.OLEDB.4.0 araçılıgıyla C:\test.xls yolunda ki excele bağlandık ve sanki tabloymuş gibi Sayfa1 deki verileri okuduk.
Select Into ile Sayfa1$ isminde bir tablo oluşturup içine aktardık.

Burda;
Yöntemimiz: OPENROWSET
Sağlayıcımız :Microsoft.Jet.OLEDB.4.0 (Diğer versiyonlar için değişebilir ben office 2003 kullandım.)
Excel versiyonu: Excel 8.0 (Diğer versiyonlar için değişir uygun olanına bakın)
Kaynak Sayfa : [Sayfa1$] (Diğer sayfalar için [Sayfa2$]... olarak değişir)
Hedef Oluşacak Tablo : Sayfa1$ (Siz istediğiniz ismi verebilirsiniz. Ancak veritabanında bu isim varsa zaten kullanımda diye hata verecektir.)

Siz bunu biraz daha geliştirip excel yolunu ve sayfa isimlerini parametre olarak yollayıp daha kullanışlı bir hale getirebilirsiniz.
Konunun sade kalabilmesi için ben o kısmına girmedim.

Umarım faydalı olmuştur.