Merhaba Arkadaslar ;

               Bugunku makalemizde Mars yapısı yapısını inceliyecegiz . Mars yapısını inceleyecegiz . Mars yapısı acık olan bir baglantı uzerinde birden fazla sqldatareader nesnesini kullanmamıza izin verir normal olusturdugumuz baglantılarda biz aynı anda sadece bir adet sqldatareader kullanabilirken baglantımızın mars ozelligini true olarak set edersek birden fazla sqldatareader ı eş zamanlı olarak çalıştırabiliriz .

Uygulamamızda

Person.contact : tablosundan contactid, firstname,lastname
Humanresources.employee : tablosundan ise gender ve maritalstatus bilgilerini alalım .

cektigimiz bu verileri ise personel tipimiz içerisine eş zamanlı iki datareader okuyarak basalım ...

Kullanıcagımız katmanlar asagıdaki gibidir ...

Dal : database islemlerimiz ile ugrasıcak olan katmanımız .
Datayonetim : Dal veya sunum katmanımızdan gelen veriler ile ugrasıcak olan katmanımız . 
Program.cs : Uygulamamızın sunum katmanı ...
Sql Server : AdventureWorks database i içerisindeki person.contact ve humanresources.employee tablolarımız . 

Adım 1 : İlk once personel tipimizi olusturalım ...

Personel.cs
-------------

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

namespace MarsUygulama
{
    class Personel
    {
        // Personel tipimiz icin gerekli olan field larımız asagıda olusturduk ...
        public int PersonelId { get; set; }
        public string PersonelAdi { get; set; }
        public string PersonelSoyad { get; set; }
        public string PersonelCinsiyet { get; set; }
        public string PersonelMedeniDurum { get; set; }

        // Tostring imizi override ettik
        public override string ToString()
        {
            return string.Format("Personel ID {0} Ad {1} Soyad {2} Cinsiyet {3} Medeni Durum {4}", PersonelId, PersonelAdi, PersonelSoyad, PersonelCinsiyet, PersonelMedeniDurum);
        }
    }
}

Dal.cs
-------

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

namespace MarsUygulama
{
    class Dal
    {
        SqlConnection con;
        SqlCommand cmd;

        public Dal()
        {
            con = new SqlConnection("data source=.; initial catalog = Adventureworks; integrated security = true; MultipleActiveResultSets = true");
            // baglantımızda MultipleActiveResultSets = true olarak set ettik artık baglantımız mars ozelligine kavustu .
        }

        // Sql ile aramdaki baglantıyı kontrol edicek kapalı ise acıcak , acık ise kapatıcak olan metotum ...
        public void BaglantiSihirbazi()
        {
            if (con.State == System.Data.ConnectionState.Closed)
            {
                con.Open();
            }
            else
            {
                con.Close();
            }
        }

        public SqlDataReader PersonelBilgiAl()
        {
            // person.contact tablomuzdan contactid , firstname , lastname kolonlarımızı aldık .
            cmd = new SqlCommand("Select contactid,Firstname,Lastname from person.contact", con);
            BaglantiSihirbazi();
            return cmd.ExecuteReader();
        }

        public SqlDataReader PersonelDetayal(int _personelid)
        {
            // person.contact tablosundan gelicek olan contactid e gore calısıcak olan ikinci select işlemimiz ama burda biz baglantı acmadıkk bunun nedeni acık oolan bir baglantı uzerinden biz bu işlemimizi kosturucagız ...
            cmd = new SqlCommand("Select gender, maritalstatus from humanresources.employee where contactid = @ID", con);
            cmd.Parameters.Add("@ID", System.Data.SqlDbType.Int).Value = _personelid;
            return cmd.ExecuteReader();
        }
    }
}

Datayonetim.cs
------------------

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

namespace MarsUygulama
{
    class Datayonetim
    {
        Dal databaseislemlerim;
        SqlDataReader Okuyucu;
        SqlDataReader OkuyucuII;

        public Datayonetim()
        {
            databaseislemlerim = new Dal();
        }

        public List<Personel> Personellerimial()
        {
            // Personeller adında bir koleksion olusturduk personellerimizi bu koleksion içerisine toplayacagız ...
            List<Personel> Personeller = new List<Personel>();
            Okuyucu = databaseislemlerim.PersonelBilgiAl(); // personelbilgial metotumuzu cagırdık onu ilk sqldatareader icerisine aldık ..
            Personel TempPersonel = null; // Temp bir personel tipi olusturduk
            while (Okuyucu.Read())
            {
                TempPersonel = new Personel(); // dongumuz icerisince ornekledik .
                TempPersonel.PersonelId = Okuyucu.GetInt32(0);
                TempPersonel.PersonelAdi = Okuyucu.GetString(1);
                TempPersonel.PersonelSoyad = Okuyucu.GetString(2);
                Personeldetayal(TempPersonel); // personeldetayal metotumuz persoel tipi almakda tipimiz referans tipli oldugu icin id degerini kullanıcam diger iki field ımıda ikinci sqldatareader ımda kullanıcagım...
                Personeller.Add(TempPersonel);
            }
            Okuyucu.Close(); // okuyucuI imizi kapattık
            databaseislemlerim.BaglantiSihirbazi(); // sql ile aramızdaki baglantımızı kapattık ...
            return Personeller; // Personellerim koleksionumuzu geri dondurduk ...
        }

        public void Personeldetayal(Personel p)
        {
            // İkinci datareader içerine verilerimizi aldık .
            OkuyucuII = databaseislemlerim.PersonelDetayal(p.PersonelId);
            while (OkuyucuII.Read())
            {
                p.PersonelCinsiyet = OkuyucuII.GetString(0); // Cinsiyet degerini atadık .
                p.PersonelMedeniDurum = OkuyucuII.GetString(1); // Medenidurumunu atadık ...
            }
            OkuyucuII.Close(); // okuyucuII ile işimiz bitti reader ımızı kapattık ...
        }
    }
}

Program.cs
--------------
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace MarsUygulama
{
    class Program
    {
        static void Main(string[] args)
        {
            Datayonetim Yonetim = new Datayonetim();
            List<Personel> Personellerim = Yonetim.Personellerimial();
            foreach (Personel item in Personellerim)
            {
                Console.WriteLine(item);
            }
        }
    }
}

Evet arkadaslar uygulamamız içerisinde es zamanlı olarak iki adet sqldatareader calıstırdık bunun icinde baglantımızda mars ozelligimizi true olarak set ettik . Mars yapısında istedigimiz kadar sqldatareader ı es zamanlı kullanabiliriz ...

.Net ile Kalın

MarsUygulama.rar (27,14 kb)