LINQ ile Programlama [1]
12.01.2010 Sal
Merhaba,
Uzun zamandır takip ettiğim hatta denemek için küçük çapta bir projeyi de kullanarak tamamladığım, .NET 3.5 ile gelen LINQ (Language Integrated Query) hakkında bir seri yazı yazmaya karar verdim. Bu yazıları okuyarak LINQ ile neler yapabileceğinizi kavramanızı amaçlıyorum.
Her yazıda örnek bir projeye de yer vereceğim, dilediğiniz gibi indirip kullanabilirsiniz.
LINQ Nedir ?
LINQ, Microsoft tarafından geliştirilen, asıl menşei çoğunuzun adını sık sık duymuş olduğunuz ORM (Object Relationship Mapping)’den gelen, .NET Framework 3.0 ve üzeri versiyonlarda kullanabileceğiniz bir veri erişim altyapısıdır. Özelliği ise, bağlandığınız veritabanı içerisinde oluşturduğunuz Stored Prosedür, Query veya fonksiyonları, .NET tabanlı programınız içerisinde oluşturabilmenizdir.
Başka bir deyişle, veritabanı üzerindeki dinamizmi programınızın kodu içerisinde yakalamanıza olanak tanıyan başı başına bir erişim altyapısıdır.
NE YAPACAĞIZ ?
Konuya henüz giriş yaptığımız için ilk yapacağımız basit bir telefon defteri uygulaması oluşturmak olacak. Bir veritabanı oluşturacağız, bunun içerisinde tablolarımızı ve örnek verilerimizi hazırlayacağız. Sonra Visual Studio kullanarak bu verilere erişeceğiz. Bu yazı sadece SELECT işlemini kapsıyor olacak. Diğer yazılarımda sırasıyla diğer CRUD işlemleri ile ileri düzeyde transaction yönetimi gibi konulara değineceğim.
1. PHONEBOOK VERİTABANI HAZIRLIĞI
Microsoft SQL Server 2005 açılır, yeni bir database oluşturulur. İsmine "Phonebook" diyeceğiz.
Şimdi bir tablo hazırlayalım ve aşağıdaki kolonları ekleyelim. Tablomuzun adına da “Telefonlar” diyelim.
Id, Ad, Soyad, EvTelefonu, CepTelefonu. Id sütununda Primary Key ve Identity tanımlamalarını yapmayı unutmayın.
Tablomuz hazır, sırada birkaç örnek veri girmek var. Tablo üzerinde sağ klik yaparak “Open Table” seçeneğini tıklayın ve girişlerimizi yapmaya başlayalım. Unutmayın, Id sütununa bir giriş yapmayacağız. Satır için gerekli bilgileri girip ENTER dediğimizde SQL bizim için otomatik olarak bir numara verecek.
2. VISUAL STUDIO 2008 ile PHONEBOOK PROJESİNİN OLUŞTURULMASI
Microsoft Visual Studio 2008 açılır.
File >> New Project denir.
Visual C# Proje Gurubundan “Windows Forms Application” seçilir.
Proje adı olarak “Phonebook” yazılır.
Sağ üst köşede bulunan ve resim üzerinde “.NET Framework 2.0” olarak gözüken değeri “.NET Framework 3.5” yapmayı unutmayın. Aksi taktirde bu proje içerisinde LINQ kullanamazsınız.
“OK” butonuna tıklanır ve Visual Studio bizim için projemizi otomatik olarak hazırlar
3. VERİLERİN LINQ KULLANILARAK GETİRİLMESİ İÇİN VERİTABANI BAĞLANTISI OLUŞTURMASI
LINQ ile kod yazmak için öncelikle hangi veritabanı kaynağına erişmesi gerektiğini söylememiz gerekiyor. Bunu yapmak için “Solution Explorer” içinde proje üzerine sağ klik yaparak “Add New Item” diyoruz.
Karşımıza çıkan diyalog kutusunda “Data” tipinin içerisinde bulunan “LINQ to SQL Classes” nesne tipini seçiyoruz ve “Add” butonuna tıklıyoruz.
Bu işlem gerçekleşir gerçekleşmez Visual Studio karşınıza aşağıdaki gibi bir designer getirmiş olmalı :
Şimdi LINQ nesnemizin özelliklerini set etmeliyiz. En önemli özellik Connection String özelliği. Bunu set etmek için aşağıdaki resimde gördüğünüz “Connection” değerine tıklayarak “New” opsiyonuna tıklamalısınız.
Açılan pencerede “Microsoft SQL Server” opsiyonunu seçerek “Continue” butonuna tıklayın.
Şimdi hangi veritabanı sunucusuna ve bu sunucu üzerindeki hangi veritabanına bağlanacağımız belirlememiz gerekiyor. Bunun için “Server Name” kutusuna bağlanmak istediğiniz SQL sunucusunun adını ve IP adresini yazabilirsiniz. Yazdıktan sonra “Connect to a database” gurubundan bağlanmak istediğiniz veritabanını seçmemiz gerekiyor.
Giriş işlemlerinizi tamamladıktan sonra “OK” butonuna tıklıyoruz.
Visual Studio içine geri döndüğümüzde “Server Explorer” sekmesini aktif hale getiriyoruz. Az önce oluşturduğunuz bağlantı kullanılarak SQL sunucu üzerinde çekilen tabloları ve diğer tüm nesneleri görüyor olmalısınız.
Tek yapmanız gereken, “Telefonlar” tablosunu sürükleyerek “DataClasses1.dbml” üzerine bırakmak. Visual Studio erişim için gerekli olan tüm sınıf yapısını otomatik olarak oluşturacak.
Kısa bir bilgi :
LINQ, veritabanı tablolarınızın herbirini bir CLASS olarak nitelendirir. Tüm CRUD (SELECT, UPDATE, DELETE ve INSERT) işlemlerini bu sınıfları kullanarak gerçekleştirirsiniz. İlgili işlemin yapılması için SQL’ sunucuya gönderilmesi gereken sorgu .NET Framework tarafından RunTime sırasında otomatik olarak generate edilir. Böylece suya sabuna dokunmadan tüm işlemlerinizi bu sınıfları kullanarak gerçekleştirebilirsiniz.
Sınıflarınızı oluşturduktan sonra CTRL+S yani Save komutu göndererek “DataClasses1.dbml” dosyasını kaydediyoruz ve kapatıyoruz.
4. WINDOWS UYGULAMASI İÇERİSİNE VERİLERİN LINQ İLE GETİRİLMESİ
Projemizi ilk oluşturduğumuzda Visual Studio bizim için Form1 isimli bir form oluşturmuştu. Bu formu açıyoruz ve form üzerine bir buton ile DataGridView ekliyoruz. Nesnelerinize istediğiniz ismi verebilirsiniz.
“Verileri Getir” olarak isimlendirdiğim butonun üzerine 2 kez tıklayarak “Click” event’ine erişiyorum :
LINQ ile sınıfları kullanarak çalıştığımızdan, bu sınıfların bir DataContext üzerinden doldurulacağı bilgisini vermemiz gerekiyor. Bizim projemizde DataContext dediğimiz, az önce kaydedip kapattığımız DataClasses1 sınıfı. Bundan aşağıdaki şekilde bir instance alıyoruz:
DataClasses1DataContext insContext = new DataClasses1DataContext();
Şimdi sorgumuzu gönderiyoruz :
var telefonlar = from p in insContext.Telefonlars
select p;
“telefonlar” adı verdiğimiz değişkenimiz, DataClasses1 içerisine getirdiğimiz “Telefonlar” nesnesinin bir kümesini kapsayacak. “from p in insContext.Telefonlars” diyerek, sorgu çalıştığında, “Telefonlar” tablosunun kayıtlarını “p” değişkeni içerisinde tutmasını istediğimizi, “select p” dediğimizde ise tabloya ait tüm sutunların getirilmesini istediğimizi belirtmiş oluyoruz. Dikkat ederseniz, eşitliğin solunda ve sağında 2 ayrı seçim kümesi var. Sol taraftaki küme programatik işlemlerimizde uygulama içerisinden erişeceğimiz değişken, sağ taraftaki “p” kümesi ise, çalıştırılacak SQL sorgusunun sonuçlarının barındırıldığı küme.
Son olarak, “telefonlar” değişkenimizi DataGridView kontrolümüze bağlıyoruz.
dataGridView1.DataSource = telefonlar;
Ve uygulamamızı F5’e basarak başlatıyoruz.
Kod görünümü :
Sonraki makalemde SELECT işlemleri içerisinde WHERE kullanmayı işleyeceğim.
Tekrar görüşmek üzere
Biz “Bankamatik”iz !
17.10.2009 Cts
DataTable.Clone() vs DataTable.Copy()
17.10.2009 Cts
Tekrar merhaba,
Aklınızda bulunsun :
DataTable.Clone() metodu, sadece datatable’ın şemasını (yani sütunlarını) kopyalar. Satırları içermez. Eğer varolan bir datatable nesnenizi içindeki veri ile kopyalamak istiyorsanız DataTable.Copy() metodunu kullanmalısınız.
Sadece Şema Kopyalamak :
1: DataTable insDataTable_Original = new DataTable();
2: insDataTable_Original.Columns.Add("Id", typeof(int));
3: insDataTable_Original.Columns.Add("Name", typeof(string));
4:
5: DataTable insDataTable_New = new DataTable();
6: insDataTable_New = insDataTable_Original.Clone();
Şema ve Verileri Kopyalamak :
1: DataTable insDataTable_Original = new DataTable();
2: insDataTable_Original.Columns.Add("Id", typeof(int));
3: insDataTable_Original.Columns.Add("Name", typeof(string));
4:
5: DataRow insDrVeri = insDataTable_Original.NewRow();
6: insDrVeri[0] = 1; //ID
7: insDrVeri[1] = "Ozan Günceler"; //NAME
8: insDataTable_Original.Rows.Add(insDrVeri);
9:
10: DataTable insDataTable_New = new DataTable();
11: insDataTable_New = insDataTable_Original.Copy();
Kolay gelsin
Excel 2007 Bluetooth Add-in Uyuşmazlığı
16.10.2009 Cum
Tekrar merhaba,
Uzun bir aradan sonra çok sinir bozucu bir problemin çözümü ile karşınızdayım. Bazı Broadcom Bluetooth modüllerinin Office 2007 yazlımları ile uyumsuzluğu sözkonusu. Örneğin ben her defasında Excel’imi kapatırken aşağıdaki şekilde bir hata almaktaydım :
Google’da biraz araştırma yaptıktan sonra, Office 2007 ürünlerinin Broadcom Bluetooth servisleri ile ilgili bir çakışması olduğunu öğrendim. Çözümü ise oldukça kolay.
NOT : Aşağıdaki değişiklikler Windows Registry içerisinde modifikasyondan oluşmaktadır. Lütfen aşağıdaki modifikasyonu yapmadan önce Registry backup’ınızı alınız. Aldığınızı varsayarak yazıma devam ediyorum…
- Öncelikle START >> RUN >> REGEDIT yapıyoruz
- HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\Excel\Addins yoluna ilerliyoruz.
- BtOfficeAddin.BtOfficeIntegration.1 segmentinde LoadBehavior Key’ini bularak değerini 0 (sıfır) olarak değiştiriyoruz.
- Bilgisayarımızı baştan başlatıyoruz.
Hepinize kolay gelsin. Tekrar görüşmek üzere !
IBM DB2 Byte[] alanlarının String Haline Getirilmesi
05.07.2009 Paz
Merhaba,
Uzun zamandır yazamıyordum, işleri yetiştirelim derken çok ihmal ettim yine. (Sorry)
Hala devam etmekte olan bir entegrasyon projesinde, müşteri için hazırladığımız .NET tabanlı Windows Forms uygulamasından, müşterinin ERP/MRP uygulaması olan JD Edwards içerisine bilgi atmamız/okumamız gerekiyordu.
JD Edwards IBM AS/400 ve DB2 üzerinde çalışan devasa bir ERP/MRP uygulaması. ODBC ile veritabanı kaynaklarına erişebiliyorsunuz. Standart .NET ODBC Provider kullanarak da istediğiniz tabloya erişip sorgularınızı gönderebiliyorsunuz. Ancak karşılaştığımız sorunlardan biri, "iSeries ODBC Provider" olarak adlandırılan DB Driver’ının, DB2 üzerindeki "string" değişkenleri "byte[]" olarak getirmesiydi.
Bunun önüne geçmek için aşağıdaki şekilde bir fonksiyon yazdım, umarım arayan birinin işine yarar
private static string AS400ByteArrayToString(byte[] InputValue)
{
byte[] byteArray = InputValue;
Decoder dbDecoder = Encoding.GetEncoding(37).GetDecoder();
char[] c = new char[dbDecoder.GetCharCount(byteArray, 0, byteArray.Length)];
dbDecoder.GetChars(byteArray, 0, byteArray.Length, c, 0);
string output = new string(c);
return output;
}
Tekrar görüşmek üzere