2016-04-03 33 views
1

VS13 ve SQL Server 2012'de bir proje üzerinde çalışıyorum ve küçük bir sorunla karşı karşıyayım. Veritabanımdaki veriyi okuyamıyorum. Verileri okumak için kullandığım SqlDataReader nesnesinde herhangi bir işlem yapmaya çalıştığımda istisna atar.SqlDataReader nesnesi, her seferinde bir işlem gerçekleştirildiğinde bir istisna atar

Elde ettiğim istisna InvalidOperationException.

Bu koduma baktığımda, bu işlevi SQL sorgusuyla parametre olarak adlandırıyorum ve döndürülen nesneyi başka bir SqlDataReader nesnesinde saklıyorum.

private SqlDataReader reader (string sqCommand) 
{ 
     myConnection.Open(); 
     string string1; 
     string1 = sqCommand; 
     SqlDataReader a = null; 

     try 
     { 
      SqlCommand Newcommand = new SqlCommand(string1, myConnection); 
      a = Newcommand.ExecuteReader(); 
     } 
     catch (Exception e) 
     { 
      MessageBox.Show(e.ToString()); 
     } 

     myConnection.Close(); 

     if (a.Read())  //**statement 1** 
      return a; 
     else 
      return null; 
    } 

Yukarıda ve nesne a veya bu aldığı nesne üzerinde gerçekleştirmek her operasyonda kodunda işaretlenmiş açıklamada 1'de istisna alır.

Lütfen kodumun nesi yanlış olduğunu veya başka bir açıklama yapmasını söyleyebilir misiniz? Hatayı bulmak amacıyla kodun diğer kısımlarına ihtiyaç varsa, bunu sağlayabilirim.

Sağladığınız zaman ve yardım için teşekkürler. :)

+0

Bu yazıya bir göz atın, bu size yardımcı olabilir. http://stackoverflow.com/questions/23187029/sqldatareader-invalidoperationexception –

cevap

3

SqlDataReader'u kullanırken bağlantınızın açık kalması gerekiyor. Sizin SqlDataReader için daha geleneksel bir kullanım aşağıdaki gibi olacaktır:

private List<object> Reader(string sqCommand) 
{ 
    using (SqlConnection myConnection = new SqlConnection(ConnectionString)) 
    { 
     myConnection.Open(); 

     using (SqlCommand cmd = new SqlCommand(sqCommand, myConnection)) 
     using (SqlDataReader reader = cmd.ExecuteReader()) 
     { 
      List<object> list = new List<object>(); 

      while (reader.Read()) 
      { 
       list.Add(reader[0]); 
      } 

      return list; 
     } 
    } 
} 
+0

Yardımlarınız için teşekkürler. Okuyucuyu kullanırken bağlantıyı açmayı düşündüm, bir dakika önce düzeltmeye çalışıyorum. Ben sadece istisna tarafından sağlanan bilgileri okumak için olur ve bağlantı kapalı olduğunu söyledi, bu yüzden ne yapmak istediğini yapamıyorum. Ben aslında form_load işlevindeki bağlantıyı açıp, son olarak (çıkarken) kapatarak sorunu çözdüm, çünkü bu sadece bir giriş formu. –

+0

@SahilSoni, bahsettiğiniz şekilde çalışmak için kod almış olsanız bile, Kirill'in örneğine göre refactor'u tavsiye ederim. En iyi uygulama, kaynakları yönetmek için IDisposable (using) kullanan bir "açık geç kapanış erken" desen takip etmektir. –

+0

@DanGuzman tamam, "geç erken kapanma" için gerekli değişiklikleri yapacağım. Çalıştığım proje, bir tür atık, herhangi bir yerde kullanılmayacak, ama bunu benim üniversitenin müfredatından dolayı yapmak zorundayım. Haziran ayından itibaren çalışacağım ve BÜYÜK olacak bir başka projem var. Eğer bunları kendim halledemeyecek olursam sorgularımı bu sitede yayınlayacağım. –

İlgili konular