Ado.Net

CloseConnection ne işe yarar neden kullanılır?

Command nesnesinin executeReader metotu ile kullanılan enum olarakta bilinir. Varsayılan değeri Default fakat ihtiyaç gereği 6 adet daha kullanılan değeri mevcuttur ki CloseConnection bunlardan biridir. Command nesnesine bağlı olan Connection nesnesi reader nesnesi kapatılana kadar açık kalır. Neden kalsın ki?

Örnek bir kullanım ile açıklayalım;

Close Connection

Close Connection

Kazancımıza bakalım;
 - Reader ile okumanın Adapter ile okumaktan daha hızlı olduğunu herkes bilir. + 1
      (Connection nesnesi kapansaydı Reader nesnesi null olarak gelecekti. Açık bırakırsak ayrı bir dert)
 - SqlCommand nesnesini Program nesnesine çekersekte uygulama System.Data.SqlClient' a bağımlı kalacaktı bu da iyi bir tasarım olmayacaktı. + 2

Bildiğiniz gibi BindingSource nesnesi .Net Framework 2.0 versiyonu ile hayatımıza girdi. Girmesiyle Data nesneleri arasında ilişki kurmak daha da kolay oldu.

Şöyle ki;

SqlConnection
cn = new SqlConnection("Data Source=.;Initial Catalog=Northwind;Integrated Security=True");
SqlDataAdapter dap = new SqlDataAdapter("select categoryid,categoryname from categories;select productid,productname,categoryid,unitprice from products"
, cn);
DataSet ds = new DataSet("relData"
);
dap.Fill(ds);
DataRelation rel = new DataRelation("myRel", ds.Tables[0].Columns[0], ds.Tables[1].Columns[2
]);
ds.Relations.Add(rel);
BindingSource bs = new BindingSource(ds, ds.Tables[0
].TableName);
listBox1.DataSource = bs;
listBox1.ValueMember = "categoryid"
;
listBox1.DisplayMember = "categoryname"
;
BindingSource bs2 = new BindingSource(bs, "myRel"
);
dataGridView1.DataSource = bs2;

Uzun zamandır Strong Type DataSet kullanmadığımdan basit bir uygulama yazmak belki bir kaç yenilik varsa da görmek istedim. Dataset içine basit birkaç data girebileceğim DataTable ekledim. Sql Server ile uğraşmamak için data kaynağı olarak xml' i uygun gördüm. Daha sonra aklıma keşke içi dolu bir xml dosyası olasa da test işlemlerini hemen yapsam.
Visual Studio 2008 kullanıyorsanız eğer Xml Schema Explorer penceresini bilirsiniz. O pencerede DataTable' a sağ tıklarsanız tam aradığım şey ile karşılaşırsınız.

Generate Sample XML
Generate Xml

Sonuç;
Xml Sample

Şöyle bir düşündüğümüzde veritabınında bulunan herhangi bir tablonun verilerini Xml biçiminde dosyaya yazmanın kaç yolu vardır acaba? Sabahları genelde işe erken gelirim, 1.5 saat kadar :).
Oturdum bir kaç örnek yaptım, paylaşıyorum tüm dünya ile. (Özgüvenin tavan yaptığı an)

Aklıma gelen ilk yöntem DataTable nesnesini kullanmak. Bu nesneyi sadece yazmak için kullanmak kaynak tüketimi açısından çok iyi bir seçim olmaz fakat kullanım kolaylığı açısında tercih edilebilir.

DataBase 2 Xml
 

Diğer bir yöntem ise henüz Veri Katmanında (DataLayer) iken oracıkta xml formatına dönüştürüp XmlTextWriter ile cayır cayır yazmak.

DataBase 2 Xml

Son yöntem ise daha önce şu yazıda kullandığım teknik ile (attribute yerine bu sefer node kullandım) XDocument ile manuel olarak xml dosyasını oluşturmak. Sanırım en zoru bu. Yanlış anlaşılmasın benim için kolay da hani ilk yapan için diyorum.

DataBase 2 Xml

Daha önceleri MARS (Multiple Active Result Sets) uygulamalarımı Treeview yada Listbox kontrollerini kullanarak yapıyordum. Listview içinde sıralama ile uğraşırken bir örnekte bu kontrolle yapayım dedim.

ListView Mars

ListView Mars

ListView Mars

Mars

Öğrencilerimin en sık sorduğu sorulardan biri de, veritabanında depolanmış resimleri web sayfasında nasıl gösterildiğidir. Internette bu konu hakkında zilyon tane yazı olmasına karşın bir tane yazma gereği hissettim.

Öncelikle anlaşılması gereken konu, html sayfalarında resim göstermenin ilk koşulu resmin fiziksel yolunun kontrole yada etikete aktarılmasıdır.
Örneğin;

<img src="/images/bullet.png" alt="Bullet" />

Diğer taraftan baktığımızda ki bu taraf veritabanı tarafıdır, resim gibi içeriklerin hangi tip veri alanında saklanacağıdır.
C# ile yazılım geliştiryorsanız resim yada bir dosya serileştiğinde (yani veritabına yazıldığında) byte dizisinden ibaret olacaktır. Bu durumda en uygun  alan tipi varbinary olsa iyi olur. :)

Kaçınılması gereken davranışlar.

<img src='<%# Eval("resim") %>' alt="Bullet" />

yada

img1.ImageUrl = reader[1].ToString();

hiç olmadı :)

img1.ImageUrl = command.ExecuteScalar().ToString();

Yapılması gereken gayet açık. Veritabınından okunan byte dizisini resim formatında dışarı aktaracak (response) bir dosya (aspx,ashx) oluşturmak ve oluşan dosyanın yolunu resmi gösterecek kontrol yada etikete atamaktır.

Örnek tabloda gösterildiği gibi resim UrunResim alanında varbinary (byte dizisi) olarak saklanıyor.

Resmi oluşturacak resim.aspx sayfasına gönderilen parametre değeri ile veritabanında basit bir sorgu yapılarak ve sonucu byte dizisi olarak elde edilir.

protected void Page_Load(object sender, EventArgs e)

   SqlConnection con = new SqlConnection
("Data Source=.;Initial Catalog=calismalar;Integrated Security=True;");
   SqlCommand com = new SqlCommand
("select UrunResim from Urunler where UrunId = @UrunId", con);
   com.Parameters.AddWithValue("@UrunId", Request["id"
]); 
   con.Open(); 
   byte[] resim = (byte
[])com.ExecuteScalar(); 
   con.Close(); 
   Response.ContentType = "image/png"

   Response.BinaryWrite(resim);
}

Son olarak ise sayfa çıktısının resim olacağını işaret eder ve çıktıyı BinaryWriter metotu ile oluştururuz.

Ben Xml'i severim de herkes sevmek yada bilmek zorunda değil. Xml ile yaptığım anket uygulamasını Sql ve Ado.Net kullanarak tekrar yaptım.

Veritabanı şeması aynen aşağıdaki gibi;

Database Diagram

Uygulamada kullanılan nesne diyagramı;

Class Diagram

Uygulamada kullanılan örnek kod;

OyVer

Uygulama kaynak kodları da burada.

Arama