2016-04-03 6 views
1

Ich arbeite an einem Projekt in VS13 und SQL Server 2012, und ich stehe vor einem kleinen Problem. Ich kann nicht scheinen, Daten von meiner Datenbank gelesen zu werden. Es wird eine Ausnahme ausgelöst, wenn ich versuche, eine Operation an dem Objekt SqlDataReader durchzuführen, das ich zum Lesen der Daten verwende.SqlDataReader-Objekt, das bei jeder Ausführung einer Operation eine Ausnahme auslöst

Die Ausnahme, die ich bekomme, ist InvalidOperationException.

Betrachten Sie diesen Code von mir, ich nenne diese Funktion mit der SQL-Abfrage als Parameter und speichert das zurückgegebene Objekt in einem anderen SqlDataReader Objekt.

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; 
    } 

I erhält die Ausnahme in der Anweisung 1 im Code markiert oben und in jeder Operation ich auf dem Objekt ein oder das Objekt durchführen, die diese erhält.

Kann mir bitte jemand sagen, was mit meinem Code falsch ist oder eine andere Erklärung geben? Wenn weitere Teile des Codes benötigt werden, um den Fehler zu finden, kann ich ihn bereitstellen.

Vielen Dank für die Zeit und die Hilfe, die Sie zur Verfügung stellen können. :)

+0

Werfen Sie einen Blick auf diesen Beitrag möglicherweise dies wird Ihnen helfen. http://stackoverflow.com/questions/23187029/sqldatareader-invalidoperationexception –

Antwort

3

Ihre Verbindung muss offen bleiben, während Sie die SqlDataReader verwenden. Eine konventionellere Verwendung für Ihre SqlDataReader wäre wie folgt:

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

Danke für Ihre Hilfe. Ich dachte, dass die Verbindung, die geöffnet wird, während ich den Leser benutze, vor einer Minute notwendig ist, während ich versuche, es zu reparieren. Ich habe gerade zufällig die Informationen gelesen, die von der Exception zur Verfügung gestellt wurden, und es heißt, dass die Verbindung geschlossen ist, so dass sie nicht tun kann, was ich wollte. Ich habe das Problem tatsächlich behoben, indem ich die Verbindung in der Funktion form_load geöffnet habe und sie am Ende geschlossen habe (beim Beenden), da dies nur ein Anmeldeformular ist. –

+0

@SahilSoni, obwohl du den Code wie beschrieben benutzt hast, schlage ich vor, dass du entsprechend Kirills Beispiel umgestaltest. Eine bewährte Methode besteht darin, einem "Open Late Close Early" -Muster zu folgen und IDisposable (Using) zum Verwalten von Ressourcen zu nutzen. –

+0

@DanGuzman okay, ich werde die notwendigen Modifikationen für "offen spät früh schließen" tun. Das Projekt, an dem ich arbeite, ist irgendwie eine Verschwendung, es wird nirgends verwendet, aber ich muss dies wegen meines Lehrplans machen. Ich habe noch ein anderes Projekt, an dem ich ab Juni arbeiten werde und das wird GROSS sein! Ich werde meine Fragen auf dieser Seite veröffentlichen, wenn ich nicht in der Lage bin, sie selbst zu beheben. –

Verwandte Themen