KMRT BSRN

"Hiç kimsenin ilgisine ihtiyaç duymadığın gün olgunlaşırsın. Hiç kimseden beklentiye girmediğin gün yara almazsın. Ve hiç kimseye bağımlı kalmazsan kazanırsın." OSHO

LINQ – SQL Database Erişimi, Select İşlemi ve Verileri XML Dosyaya Yazmak

Yorum bırakın


Language Integrated Query (LINQ) , dil ile bütünleştirilmiş sorgu teknolojisi ile IEnumerable arayüzünden iplemente edilmiş dizi(array) nesneleri üzerinde SQL ifadeleri içeren sorgular ile filtreleme yapabilmenizi sağlamaktadır. Bu konuyla ilgili olarak internette bulunan makalelerin hepsini okumanızı tavsiye ederim. Bu teknolojinin kullanılmasını şiddetle tavsiye ederim. 🙂

LINQ ile IEnumerable arayüzünden iplemente edilmiş nesneler üzerinde SQL ifadelerini kullanarak sorgulama yapılabildiği gibi, Database nesnelerini temsil eden nesneler üzerinde de kullanabilir hatta XML nesnelerinde bile kullanabilirsiniz.
Yazdığınız kod daki netliği(okunabilirlik) ve sadeliği sizde kullanınca farkedeceksiniz.. Hatta sizi birçok rutin döngüden kurtaracaktır. Bu teknolojiyi kullandıktan sonra aklıma gelen ilk düşünce ,bence fazla uzak olmayan bir zaman sonra artık kod yazmayacağız ki bu teknoloji ile bile bu yönde çok büyük bir adım atıldığına inanıyorum. Bu teknolojiyi bile öğrenince bu teknolojinin kapsadığı alanda artık düşüneceğimiz tek şey; nasıl kod yazayım diye düşünmek değil, yapılacak iş nedir diye olacaktır. Bence bunu sizde farkedeceksiniz..
Güzel bir LINQ örneği ile bu yazıyı sonlandıralım 🙂
AdventureWorks isimli database’den “Production.ProductCategory” isimli tablodaki verileri çekecek ve üzerinde filtreleme yapacak ve ekrana verileri yazacak bir LINQ örneği düşünüyorum. Bunun için sırasıyla ilk önce bir console projesi oluşturalım. Ben ismini “CS30_CreateDLinq” oalrak adlandırdım. Projemizde kullacağımız LINQ nesneleri için projemize gereken referans’ları eklememiz gerekiyor. Referans listesi aşağıdaki gibi olmalıdır..

Projemiz de;
–> AdventureWorks database’ini temsil eden bir class,

–> Production.ProductCategory isimli tabloyu temsil eden bir class oluşturacağız..
İlk olarak Production.ProductCategory isimli tabloyu temsil eden bir class’ı oluşturalım. “ProductCategory.cs” isimli class’ı projemize ekliyoruz.


ProductCategory.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Data.Linq;
using System.Text;
using System.Data.Linq.Mapping;
namespace CS30_CreateDLinq
{
[Table(Name = “Production.ProductCategory”)]
public class ProductCategory
{
[Column(Name = “ProductCategoryID”, IsPrimaryKey = true, CanBeNull = false, IsDbGenerated = true)]
public int ProductCategoryID { get; set; }
[Column(Name = “Name”, CanBeNull = false)]
public string Name { get; set; }
[Column(Name = “rowguid”, CanBeNull = false)]
public Guid RowGuid { get; set; }
[Column(Name = “ModifiedDate”, CanBeNull = false)]
public DateTime ModifiedDate { get; set; }
}
}


Tablodaki her bir kolon için bir Property tanımladık ve kolonların özelliklerini property’lere attribute olarak ekledik.. Tablo ismini class’ın üstünde belirttik.

Şimdi database’i temsil eden class’ı oluşturalım. Bu class’da yukardaki tabloyu işaret eden bir property oluşturacağız.. Database’i temsil eden class’lar DataContext nesnesinden inherit edilir ve DataContext nesnesinin metodlarından faydalanacağız..


AdventureWorks.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace CS30_CreateDLinq
{

[System.Data.Linq.Mapping.Database(Name = “AdventureWorks”)]
public class AdventureWorks : System.Data.Linq.DataContext
{

public System.Data.Linq.Table ProductCategories
{
get
{
return this.GetTable();
}
}

public AdventureWorks(string connectionString)
: base(connectionString)
{ }

}
}


Database ‘i temsil eden class’ın Constructor’ını oluştururken ConnectionString parametresi alıyoruz ve bu parametreyi inherit alınan DataContext nesnesine, base class’a geçiriyoruz.. DataContext nesnesi buradan gerekli bağlantı nesnelerini ve sorgulama nesnelerini hatta sorguları oluşturup çalıştırabiliyor.

Bu database nesnesine ProductCategory tablosunu temsil eden bir Property ekledik property’nin tipi ProductCategory class’ından oluşan bir Table ‘dır. Bu Property’in değeri okunmak istendiğinde yani kullanıldığında; GetTable extension(genişletilebilir) metodu ile belirtilen tip’te(ProductCategory tipinde) bir tablo elde edilir. Biz ProductCategory tablosundan veri okuyacağımız için bu tip ProductCategory tipi olmalıdır. Böylece elimizde ProductCategory class’larından oluşan bir tablo yani bir nevi bir liste elde etmiş olacağız.

Bu arada database’i temsil eden class üstüne bağlanmak istediğimiz database’in ismini attribute olarak geçmeyi unutmuyoruz..

Artık console verimizi çekmeye hazırız..

Program.cs class’ımıza şu şekilde yazıyoruz.. Kod açıklama satırları ile şöyle;


Program.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Xml.Linq;
using System.Text;

namespace CS30_CreateDLinq
{

public class Program
{
static void Main(string[] args)
{

//Bütün veri çekilir..
var productCategories = GetProductCategoryData();

if (productCategories != null)
{
//Tüm veri listelenir..
foreach (ProductCategory pro in productCategories)
{
Console.WriteLine(
“\t” + pro.Name +
“\t” + pro.ProductCategoryID.ToString() +
“\t” + pro.RowGuid.ToString() +
“\t” + pro.ModifiedDate.ToShortDateString());
}
}

Console.WriteLine();
Console.ReadKey();

}

public static ProductCategory[] GetProductCategoryData()
{

//Database’i temsil eden nesne oluşturulur..
AdventureWorks adwentureWorksDatabase = new AdventureWorks(“Data Source=localhost;Initial Catalog=AdventureWorks;Integrated Security=True“);

//Tüm veri elde edilir..
var productCategories = from pro in adwentureWorksDatabase.ProductCategories
select pro;

//Veri yoksa uyarı verilir..
if (productCategories == null)
{
Console.WriteLine(“Database nesnesi null..”);
Console.WriteLine();
Console.ReadKey();
}

//Veri dizi olarak geri döndürülür..
return productCategories.ToArray();

}


Yukardaki kod ile ProductCategory tipinde bir dizi elde edip, verileri ekrana basıyoruz..

Peki verileri bir xml dosyaya yazmak istesek ve bunun için XLINQ ‘dan faydalansak, bunun için kodumuzu şu şekilde yeniden yazalım..


Program.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Xml.Linq;
using System.Text;

namespace CS30_CreateDLinq
{

public class Program
{

static void Main(string[] args)
{

//Bütün veri çekilir..
var productCategories = GetProductCategoryData();

if (productCategories != null)
{

//Tüm veri listelenir..
foreach (ProductCategory pro in productCategories)
{
Console.WriteLine(
“\t” + pro.Name +
“\t” + pro.ProductCategoryID.ToString() +
“\t” + pro.RowGuid.ToString() +
“\t” + pro.ModifiedDate.ToShortDateString());
}

//Tüm veriyi XML dosyaya yazma işlemi başlatılır.
Console.WriteLine();
WriteProductCategoryDataToXmlFile();

}

Console.WriteLine();
Console.ReadKey();

}

public static ProductCategory[] GetProductCategoryData()
{


//Database’i temsil eden nesne oluşturulur..
AdventureWorks adwentureWorksDatabase =new AdventureWorks(“Data Source=localhost;Initial Catalog=AdventureWorks;Integrated Security=True“);

//Tüm veri elde edilir..
var productCategories = from pro in adwentureWorksDatabase.ProductCategories
select pro;

//Veri yoksa uyarı verilir..
if (productCategories == null)
{
Console.WriteLine(“Database nesnesi null..”);
Console.WriteLine();
Console.ReadKey();
}

//Veri dizi olarak geri döndürülür..
return productCategories.ToArray();
}

public static void WriteProductCategoryDataToXmlFile()
{


//Veriyi yazacak XML dosya oluşturulur..
string filePath = CreateXmlFile();

//XML dosyaya yazılacak veri elde edilir..
var productCategories = GetProductCategoryData();

//Veri varsa..
if (productCategories != null)
{

//Tüm veriyi XML dosyaya yazacak metod çağrılır..
WriteDataToXmlFile(productCategories, filePath);

//Yazım işleminin bitti§ini belirten uyarı verilir..
Console.WriteLine(“\nXML Dosya Oluşturuldu..\n”);
}
else
{

//Veri yoksa uyar verilir..
Console.WriteLine(“\nXML Dosya Oluşturmak için Gereken Veri Dizisi Yok !\n”);
}
}

private static string CreateXmlFile()
{

string path = string.Empty;

do
{
//Kullanıcıdan XML dosya konumu okunur..
Console.Write(“XML Dosya Konumunu Giriniz : “);
path = Console.ReadLine();

try
{

//Dosya oluşturulmaya çalıştırılır.. Eğer oluşturulamaz ise hata oluşur..
System.IO.File.Create(path).Close();

//Dosya oluşturulursa dosya konumu geri döndürülür..
return path;
}
catch (Exception)
{
//Dosyanın oluşturulamamasından dolayı uyarı verilir..
Console.WriteLine(“\nGeçerli Bir Konum Giriniz !\n”);
path = string.Empty;
}

//Dosya oluşturulana kadar işlem tekrarlanır..
} while (path.Trim() == string.Empty);

return path;
}

private static void WriteDataToXmlFile(ProductCategory[] productCategories, string filePath)
{

//Eğer XML ‘e yazılacak veri varsa..
if (productCategories.Length > 0)
{

//XmlElement’leri tutacak bir liste oluşturulur..
List productCategoryElements = new List();

//XmlElement’ler oluşturulup listeye atılır..
foreach (ProductCategory pro in productCategories)
{

productCategoryElements.Add(
new XElement(“ProductCategory”,
new XElement(“ProductCategoryID”, pro.ProductCategoryID.ToString()),
new XElement(“Name”, pro.Name),
new XElement(“RowGuid”, pro.RowGuid.ToString()),
new XElement(“ModifiedDate”, pro.ModifiedDate.ToShortDateString())));

}

//XmlDocument oluşturulur, Tanımlama bilgisi ve iç elementler XmlDocument’e eklenir..
XDocument xmlDoc = new XDocument(
new XDeclaration(“1.0”, string.Empty, “true”),
new XElement(“ProductCategories”, productCategoryElements.ToArray()));

//XmlDocument dosyaya yazılır..
xmlDoc.Save(filePath);

}
else
{

//Veri yoksa uyarı verilir..
Console.WriteLine(“\nXML Dosya Oluşturmak için Gereken Veri Dizisi Yok !\n”);

}
}
}

}


Yukardaki kodu çalıştırdığınızda ilk önce veriler listelenecektir. Ardından sizden bir dosya konumu istenecek ve belirttiğiniz dosya konumuna örneğin; “c:\test.xml” yada sadece “test.xml” yazarak programın çalıştığı proje klasöründeki BIN – DEBUG klasörü içine dosyanız oluşturulacaktır.. Eğer belirttiğiniz konum geçersiz yada belirttiğiniz konuma dosya oluşturulamazsa sizden tekrar geçerli bir konum istenecektir.

LINQ ile XLINQ kullanımını ve bir SQL database’den veri çekme işlemini nasıl yapacağımızı ve LINQ’nun sorgulama yapısını kısaca görmüş olduk. Konunun detayları için internette bol bol makale olduğundan çok detaya girmedim. LINQ ‘yu mutlaka kullanmanızı tavsiye ederim, bu basit örnekle bile avantajları ortadadır 🙂 Herkese iyi çalışmalar..

Uygulamayı indirmek için tıklayınız..

Reklamlar

Yazar: K. Murat BAŞEREN, MBA, MCP

I am a senior software developer, MCP, consultant, blogger, former chemist and software trainer. My interests range from software developer to technology. I am also interested in web development, education, and coffee.

Bir Cevap Yazın

Aşağıya bilgilerinizi girin veya oturum açmak için bir simgeye tıklayın:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Twitter resmi

Twitter hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Google+ fotoğrafı

Google+ hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Connecting to %s