Respond needs javascript to run. To find out more click here
Projelerim » Sayfa 3 » Serdar Demir
RSS
 

Archive for the ‘Projelerim’ Category

Linq to sql nedir ?

10 Nis

Linq to sql e ilk adımımız

Linq .net 3.5 ile gelen yeni teknolojilerden,  Linq teknolijisi tamamen veri erişim işlemini daha kolay ve anlaşılır hale getirme amaçlı. Bu veri erişim yöntemleri Linq to XML,Linq to object ve linq to sql olarak veri kaynağına göre değişiklik göstermekte. Biz bugun linq to sql i inceleyeceğiz.

Bundan önceki veri erişim yöntemi ado.net ti (okullarda hala bize bunu öğretiyorlar J) şimdi gelelim ikisinin farkına öncelikle şunu belirteyim linq to sql ile yaptıklarımızı ado.net ile de yapabiliriz. Fakat burda önemli olan daha kolay kullanım ve kod kısalığıdır. Klasik yöntemde nasıl yapıyorduk? En basitinden veritabanından veri çekmek için connecting stringler datatable lar datadapterler sql command bağlantıyı açma kapama gibi bir çok nesne ye ihtiyaç duyuyorduk küçük çaplı uygulamalarda bu pek göze batmıyor fakat 1000 satırlık kodu 100 satıra indirmeyi kim istemezki hemde çok kullanışlı bir şekilde lafı çok uzattık geçelim artık linq to sql  e :) ve northwind veritabanını kullanarak uygulama geliştirelim.

Öncelikle projeyi açıp add new item diyerek linq to sql class ekliyoruz.

Bize bir sayfa oluşturacak bu sayfada ise solution explorer dan projemizde kullanacağımız tabloları sürükleyip bu alana bırakıyoruz nortwind tablosunun category ve products tablosunu ekliyorum. Linq to sql bu tablolar arasında olan bire çok ilişkiyi otomatik oluşturuyor. Eğer bu işlemi manuel yapmak istersek toolbaxtan “Association”  ekleyip ilişkiyi siz beliryebilirsiniz. Bu kısımda tablo isimlerini değiştirmek isterseniz yine bu kısımda tablolarınızı türkçeleştip kullanabilirsiniz

Şimdi gelelim form kısmına öncelikle eklediğimiz linq to sql sınıfından  bir tane oluşruyoruz.

SqlConnectionStringBuilder ayar = new SqlConnectionStringBuilder();

ayar.IntegratedSecurity = true;

ayar.InitialCatalog = "Northwind";

ayar.DataSource = ".";

SqlConnection con = new SqlConnection(ayar.ConnectionString);

con.Open();

SqlCommand cmd = new SqlCommand("select * from Categories ", con);

DataTable dt = new DataTable();

SqlDataReader dr = cmd.ExecuteReader();

while (dr.Read())

{

listBox1.Items.Add(dr.GetString(0));

}

Yukarda da görüldüğü gibi basit bir işlemde bile kod  neredeyse 2 katına çıktı bunun çok büyük bir uygulama olacağını düşündüğümüzde fark çok açıktır. Diyelim ki bizim şimdi yapacağımız gibi 2 tabloyu bağlama işlemi yapacaksınız bunu  ado ile yapacaksanız  datarelation gibi ekstra nesneler kullanmanız gerekecek J yani dediğim gibi işler değiştikçe kod çok karışıyor. Bu işlemleri şimdi linq ile yapalım.

Linq to sql de join

DataClasses1DataContext dc = new DataClasses1DataContext();

var urunler = (from p in dc.Products

join c in dc.Categories on p.CategoryID equals c.CategoryID

select p.Category.CategoryName).Distinct();

foreach (var item in urunler)

{

MessageBox.Show(item.ToString());

}

Products ve categories tablosunda ortak sütun category id ye göre inner join işlemini gerçekleştirdik.

Şimdi de linq to sql ile where ve like işlemi:

//Where işlemi

DataClasses1DataContext dc = new DataClasses1DataContext();

var urun = from urunler in dc.Products

where urunler.ProductName.Contains("Chai")

select urunler.ProductName;

foreach (string item in urun)

{

listBox1.Items.Add(item);

}

//like işlemi

DataClasses1DataContext dc = new DataClasses1DataContext();

var urunler = from p in dc.Categories

where SqlMethods.Like(p.CategoryName, "B%")

select p.CategoryName;

foreach (var item in urunler)

{

listBox1.Items.Add(item);
}

Like işlemini kullanabilmeniz için sqlmethods un yer aldığı data.sqlclient kütüphanesini eklemeniz gerekmektedir.

Linq to sql group by işlemi

DataClasses1DataContext dc = new DataClasses1DataContext();

var urun = from urunler in dc.Products

group urunler by urunler.ProductName;

foreach (var item in urun)

{

listBox1.Items.Add(item.Key.ToString());

}

Şimdi gelelim veri işleme kısmına “Update Delete ve Insert” işlemleri

Linq to sql insert işlemi

Diyelim ki okul adında bir tablomuz var ve biz bu tabloya okul adı ve adresini girmek istioruz.

void kaydet()

{

DataClasses1DataContext dc = new DataClasses1DataContext();

okul yeni = new okul()// Tabo adımız

{

okuladi = "Mersin Üniversitesi",

adres = "Erdemli"

};

dc.okuls.InsertOnSubmit(yeni);

dc.SubmitChanges();
}

Linq to sql delete işlemi

Insert işlemi ile eklediğimiz kaydı silelim;

void sil()

{

DataClasses1DataContext dc = new DataClasses1DataContext();

okul yeni = dc.okuls (k => k.okulid == 0);

dc.okuls.DeleteOnSubmit(yeni);

dc.SubmitChanges();

}

Şimdi burda şimdiye kadar görmediğimiz bir ifade ile karşı karşıyayız lambda ifadesi => yani yukarıdaki kodun karşılığı k adında takma bir kayıt oluşturduk. Ve bu kaydın id si 0 olan ilk kaydı silmesini istiyoruz. Silme işlemide bir bakıma güncelleme yapılmasını gerektirir bu yüzden update işleminide bu mantıkla yapacağız.

Linq to sql update işlemi

void guncelle()

{

DataClasses1DataContext dc = new DataClasses1DataContext();

okul yeni = dc.okuls.First(k => k.okulid == 0);

yeni.adres = "safranbolu";

dc.SubmitChanges();

}

Bir sonraki makalemizde => ifadeleirini ayrıntılı olarak inceleyeceğiz.

 
4 Comments

Posted in C#, Makaleler

 

Sql pooling nedir?

06 Nis

SQL POOLİNG

Sql pooling nedir?

Pooling bildiğimiz gibi havuz anlamındadır sql açısından da ilk bakışta bu anlamı taşır çünkü sql pooling connectionların tutulduğu bir havuz olarak düşünebiliriz.

Peki ne işe yara sql pooling?

Connection pooling size var olan connectionları yeniden kullanmanıza olanak sağlar. Örnek olarak birbirinde farklı tipteki uygulamalar aynı bağlantıyı kullanabilirler güncelleme veri girişi gibi farklı işlemler gerçekleştirebilirler. İşte bu gibi durumlarda tekrar bağlantı oluşturarak kaybedilen zaman ve performansın pooling sayesinde önüne geçilmiş olur. Connection pools bu işlemleri süreçlere ayırarak gerçekleştirir. Uygulama alanı ve bağlantı cümlesi olarak.

Aşağıdaki kod parçası bizim bağlantı cümlemiz pooling default olarak true haldedir.

SqlConnectionStringBuilder ayar = new SqlConnectionStringBuilder();
ayar.DataSource = “.”;
ayar.InitialCatalog = “personel”;
ayar.IntegratedSecurity = true;
ayar.Pooling = false;

OleDb için de aynı şekilde pooling işlemi gerçekleştirilir. Pooling işleminin kendi içerisinde bazı keywordleri vardır bunları sırayla açıklayalım.

ConnectionReset= Bu özellik true olursa sql server bağlantının kesilmesi veya zayıflaması durumunda bağlantıyı resetler.

Enlist= Eğer bağlantınızı bir transaction un bir parçası olarak kullanacaksanız true olması gerekir.

Load Balance TimeOut= Bu özellik bellekten silinecek bir connection pool un silinmeden önce ne kadar süre minmum kalması gerektiğini gösterir.

MaxPoolSize= İzin verilen en fazla connection nesnesini belirtir. Server uygulamalarında kullanılabilir bir özellik.

MinPoolSize= İzin verilen en az connection nesnesini belirtir.

Şimdi gelelim oledb connection string için oledb servislerine

OLEDB SERVİSLERİ                                                                         DEĞERİ

Bütün servileri aç                                                                           ayar2.OleDbServices = -1;
Bütün servileri aç pooling ve transaction hariç                                 ayar2.OleDbServices = -4;
Client cursor dışında bütün servisleri aç                                          ayar2.OleDbServices = -5;
Bütün servisleri kapat                                                                    ayar2.OleDbServices = 0;

Şimdi gelelim pooling açık ken ve kapalı iken aradaki performans farkını görmeye öncelikle aşağıdaki tasarımı oluşturuyoruz.

2 adet 10000 lik döngü kuruyoruz ve birinci butuna bastığımızda poling özelliği açık 2. Butona tıkladığımızda ise pooling kapalı olacak şekilde kodumuzu yazıyoruz döngüye girmeden önceki zamanı ve döngü sonundaki zamanı alıp timespan ile aradaki farkı yazdırıyoruz. Pooling açıkken bu işlemi 242 mili saniye de gerçekleştiriyor aynı işlemi pooling kapalı iken 17770 saniye gerçekleştiriyor bu da ardaki uçurumu ve zaman farkını ortaya çıkartıyor. Fakat bu işlemi çok kullanıcılı olmayan ve  veritabanına fazla bağlantı gerekmeyen işlerde kullandığımızda ise tam tersi bir durum söz konusu pooling in açık olması bir dezavantaj oluyor.

SqlConnectionStringBuilder ayar = new SqlConnectionStringBuilder();

ayar.DataSource = ".";

ayar.InitialCatalog = "personel";

ayar.IntegratedSecurity = true;

ayar.Pooling = true;

SqlConnection con = new SqlConnection(ayar.ConnectionString);

DateTime dtBaslangic = DateTime.Now;

for (int i = 0; i < 10000; i++)

{

con.Open();

con.Close();

}

DateTime dtBitis = DateTime.Now;

TimeSpan tsGecerSure = dtBitis - dtBaslangic;

textBox3.Text = tsGecerSure.TotalMilliseconds.ToString()+" ms";

Sql server ın performans izleme paneli ile de aradaki farkı kolayca görebiliriz.  Poolingin kapalı ve açık olduğu noktalar işaretlenmiş şekilde

 

C# manifest dosyası ile UAC’ yi atlatmak

26 Mar

C# manifest dosyası ile UAC’ yi atlatmak

Uac user account control (kullanıcı denetimi teknolojisi) Windows vista ile gelen güvenlik özelliklerinden biridir. Sistemdeki özel yetki gerektiren dosyalar üzerinde işlem yapmak istediğinizde sizin onayınızı alması olayıdır. Buna örnek olarak cmd den diskpart yazdığımızda bu işlem için bizim onayımızı ister. Uac yi Kullanici hesap ayarları denetiminden manuel olarak kapatabilir ve değiştirebilirsiniz.


C# ile yaptığımız programlarda bazen UAC ye takılabiliriz özellikle klasör oluşturma veya regedit işlemlerinde örneğin regeditte local_machine den bir klasör silme işlemini aşağıdaki gibi direk çalıştırdığınızda güvenlik hatası verecektir.

Registry.LocalMachine.CreateSubKey(“SOFTWARE”).CreateSubKey(“Microsoft”).CreateSubKey(“Cryptography”).DeleteSubKey(“RNG”);

Yaptığımız programların UAC ye takılmaması için manifest dosyasını kullanırız. Manifest dosyası “once click ” ayarlarını gerçekleştirdiğimiz dosyamızdır. Projemize manifest dosyasını eklemek için solution explorer dan properties seçip “Security” sekmesinden once clik kısmını enabled yapıyoruz bunu yaptığımız anda bizim için manifest dosyanısı oluşturuyor fakat burda dikkat etmemiz gereken oluşturduktan sonra tekrar disabled hale getirmemiz gerekiyor.

Solution dan manifest dosyanızı açıyoruz dosyamız xml formatında. Manifest doayamızın içeriği aşağıdaki gibidir şimdi bölümler halinde inceleyelim.

trustInfo: Elementi projemizin güvenlik ayarlarını yapmamızı sağlar.

<trustInfo xmlns=”urn:schemas-microsoft-com:asm.v2″>

<security>

<requestedPrivileges xmlns=”urn:schemas-microsoft-com:asm.v3″>

<!– UAC Manifest Options

If you want to change the Windows User Account Control level replace the

requestedExecutionLevel node with one of the following.

<requestedExecutionLevel  level=”asInvoker” uiAccess=”false” />

<requestedExecutionLevel  level=”requireAdministrator” uiAccess=”false” />

<requestedExecutionLevel  level=”highestAvailable” uiAccess=”false” />

If you want to utilize File and Registry Virtualization for backward

compatibility then delete the requestedExecutionLevel node.

–>

<requestedExecutionLevel level=” requireAdministrator ” uiAccess=”false” />

</requestedPrivileges>

<applicationRequestMinimum>

<defaultAssemblyRequest permissionSetReference=”Custom” />

<PermissionSet version=”1″ Unrestricted=”true” ID=”Custom” SameSite=”site” />

</applicationRequestMinimum>

</security>

</trustInfo>

Yukarıda gördüğümüz manifest dosyasındaki asInvoker Uygulama en düşük yetki seviyesinde çalıştır anlamına gelir. highestAvailable kullanıcıdan yüksek yetki ile çalışır ve bizden yetki ister. requireAdministrator Uygulamamız admin yetkisiyle çalışır. Biz işte burda default olarak gelen asinvoker kısmını  requireAdministrator olarak değiştireceğiz böylece projemiz UAC ye takılmadan işlemlerini gerçekleştirebilecek.

entryPoint: Click once olayı(publish, update ..) gerçekleştiği anda istemcide çalışacak olan program.

<entryPoint>

<commandLine file=”Notepad.exe” parameters=”run” />

</entryPoint>

 
1 Comment

Posted in C#, Makaleler