Ado.NET “Invalid attempt to call MetaData when reader is closed” Hatası

Genellikle amatörce kod yazım hatalarından birisi olan “Invalid attempt to call MetaData when reader is closed” hatasından bahsedeceğim.

Ado.NET işlemleri yaptığımız bir sayfada birden fazla SqlDataReader nesnesi kullanıyorsak eğer aşağıdaki gibi bir işlem hatası yapmış olabiliriz.

        SqlConnection baglanti = new SqlConnection("Provider");

        private void Islem(object sender, EventArgs e)
        {
            baglanti.Open();
            SqlCommand Sorgu = new SqlCommand("Sorgu",baglanti);
            SqlDataReader dr = Sorgu.ExecuteReader();
            while (dr.HasRows)
            {
                textbox1.Text = dr.GetValue(0).ToString();
            }
            dr.Close();
            dr.Dispose();
            baglanti.Close();
//-----------------------------------------------
            baglanti.Open();
            SqlCommand Sorgu2 = new SqlCommand("Sorgu",baglanti);
            SqlDataReader dr2 = Sorgu.ExecuteReader();
            while (dr2.HasRows)
            {
                textbox1.Text = dr.GetValue(0).ToString();
//Hata dr referansının kullanılmaya çalışılmasıdır.
            }
            dr2.Close();
            dr2.Dispose();
            baglanti.Close();
        }

Gördüğünüz gibi nesne tabanlı programlama tekniğinin kullanılmadığı hata olasılığı yüksek ve bir o kadar da karmaşık bu tarz yazılımlarda “Invalid attempt to call MetaData when reader is closed” hatasını almanız gayet doğaldır.Çünkü bir “dr” referansındaki SqlDataReader nesnesini kullanıp Dispose ettiğiniz halde alt satırlarda “dr2” referansı yerine yanlışlıkla “dr” referansının kullanılması bu hataya sebep olmaktadır.

Bu hatanın çözümü kolaydır ama dikkat etmemiz gereken temel prensip kaliteli, anlaşılır ve dünya standartlarına uygun bir tarzda kod yazmanızdır.Aksi halde programlama sanatını anlamayıp yanlış lanse etmenize sebep olacaktır.

Faydalanmanız dileğiyle..

Bunlar da hoşunuza gidebilir...

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

*