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;


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 N' 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

Sonuç;

Şö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.

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.

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.

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.




Öğ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.
<
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)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;
Uygulamada kullanılan nesne diyagramı;
Uygulamada kullanılan örnek kod;

Uygulama kaynak kodları da burada.
Öyle bir tablom olsun ki sınırsız kategori ve alt kategori ekleyebileyim. Neden bahsettiğimi anladınız sanırım :) Halk arasında Sınırsız Ağaç Yapısı denilen tablo çeşidi.
Örnek tablo:

Örneğimizdeki yapı şöyle olacak; Kategori hiyerarşinin en üstünde ise alt kategori değeri 0 (sıfır) olacak. Değilse üst kategorinin id değeri yer alacak.

Azıcık kod yazalım.
.png)
Sonuç;

Örnek proje.
Northwind sql eğitimlerinde sıkça kullandığım (basit yapısınsan dolayı) bir veri tabanı örneğidir. Aynı zamanda eskidir de :) En sık başvuru yaptığım tablolardan biri de Categories tablosudur. Bu tabloda ürün kategoriler resimleri ile yer almaktadır.

Yer almasına alıyor da, alırken ilk 78 ve son 78 byte kısmında ole nesne bilgisi olduğu için kimi zaman sorunlar yaşanıyor.

Her nekadar DataGridView kontrolü bunu otomatik gösterse de, manuel olarak PictureBox gibi bir kontrolde göstermek istersek şu şekilde kullanmak gerekiyor.

Örnek proje.
Repeater, veri kontrolleri içinde en sevdiğimdir. Onu esnek hale getiren basit yapısı ben en cezbeden özelliğidir. Basit olduğundan dolayı görevi sadece veri göstermek. Peki sıralama yapmak istersek ne yapmalıyız?
Aslında cevap basit; HeaderTemplate içine koyacağımız LinkButton kontrolleri ve sıralama bilgilerini ViewState içinde tutarak yapabilir.
Burada tablo başlıklarına birer LinkButton ve Image kontrolü koyuyoruz. LinkButton sıralama komutunu işlerken, Image kontrolleride sıralama yapılan satırları işaret edecek.

Sıralama sırasından iki adet bilgiye ihtiyaç var. Sıralanacak veri kolonu ve sıralama yönü. Bu bilgileri ViewState içinde saklıyoruz. Kullanım kolaylığı olması için Özellik (Property) olarak tanımlıyoruz.

Sıralama komutu için ado.net kodlarımız. Kolon adı parametre olmadığı için String nesnedinin Format metotunu kullandım.

Uygulama sonunda elde edeceğimiz veri listesi.

Kalan detaylara projeyi indirip bakabilirsiniz.
Projeyi indir.