2016-04-12 10 views
0

ich den FehlerExecuteNonQuery erfordert eine offene Verbindung

ExecuteNonQuery kräver en öppen och tillgänglig Anschluss bekommen. Anslutningens aktuella status är stängd.

Bei dem Versuch, meinen Code auszuführen. Ich dachte, ich öffnete und schloss die Verbindung entsprechend

string connetionString = null; 
       SqlConnection connection; 
       SqlCommand command; 
       SqlDataAdapter adpter = new SqlDataAdapter(); 
       DataSet ds = new DataSet(); 
       XmlReader xmlFile; 
       string sql = null; 

     connetionString = "Data Source=tsrv2062;Initial Catalog=Bums;User ID=BumsUser;Password=2tusen7Bums"; 

     connection = new SqlConnection(connetionString); 

     xmlFile = XmlReader.Create("navetout.xml", new XmlReaderSettings()); 
     ds.ReadXml(xmlFile); 


     connection.Open(); 

     DateTime datum = DateTime.Now; 

     SqlCommand command1 = new SqlCommand("UPDATE Seamen SET FirstName = @FirstName, LastName = @LastName, NationalRegistrationCountyCode = @NationalRegistrationCountyCode, NationalRegistrationMunicipalityCode = @NationalRegistrationMunicipalityCode, CitizenshipCode = @CitizenshipCode, LastChangedDate = @LastChangedDate WHERE PersonalIdentityNumber = @PersonalIdentityNumber", connection); 

     for (int i = 0; i < PersonalIdentityNumber.Count; i++) 
     { 

      var personnummer = PersonalIdentityNumber[i]; 
      var fornamn = FirstName[i]; 
      var efternamn = LastName[i]; 
      var lankod = LanKod[i]; 
      var kommunkod = Kommunkod[i]; 
      //var utdelAdress2 = UtdelAdress2[i]; 
      //var postNr = PostNr[i]; 
      //var postOrt = PostOrt[i]; 
      //var fodelselanKod = FodelselanKod[i]; 
      //var fodelseforsamling = Fodelseforsamling[i]; 
      var medborgarskapslandKod = MedborgarskapslandKod[i]; 
      // var medborgarskapsdatum = Medborgarskapsdatum[i]; 


      command1.Parameters.Clear(); 
      command1.Parameters.AddWithValue("@PersonalIdentityNumber", personnummer); 
      command1.Parameters.AddWithValue("@FirstName", fornamn); 
      command1.Parameters.AddWithValue("@LastName", efternamn); 
      command1.Parameters.AddWithValue("@NationalRegistrationCountyCode", lankod); 
      command1.Parameters.AddWithValue("@NationalRegistrationMunicipalityCode", kommunkod); 
      //command1.Parameters.AddWithValue("@NationalRegistrationDistributionAddress2", utdelAdress2); 
      //command1.Parameters.AddWithValue("@NationalRegistrationPostCode", postNr); 
      //command1.Parameters.AddWithValue("@NationalRegistrationCity", postOrt); 
      //command1.Parameters.AddWithValue("@BirthCountyCode", fodelselanKod); 
      //command1.Parameters.AddWithValue("@BirthParish", fodelseforsamling); 
      command1.Parameters.AddWithValue("@CitizenshipCode", medborgarskapslandKod); 
      // command1.Parameters.AddWithValue("@CitizenshipDate", medborgarskapsdatum); 
      command1.Parameters.AddWithValue("@LastChangedDate", datum); 



      command1.ExecuteNonQuery(); 

      Console.WriteLine(personnummer); 



     connection.Close(); 
     Console.WriteLine("Done"); 

Kann jemand finden, was los ist?

Antwort

3

Ihr connection.Close() scheint in einer Schleife zu sein, weil Sie eine schließende Klammer vergessen haben. Nur die erste Iteration ist erfolgreich, und die zweite Iteration schlägt aufgrund der geschlossenen Verbindung fehl.

Allerdings nicht hetzen, um die Klammer hinzuzufügen und es als behoben betrachten. Dies wäre keine gute Möglichkeit, das Problem anzugehen, da ein anderes Problem bestehen würde - Sie müssten sich damit beschäftigen, die Verbindung für eine Ausnahme zu schließen.

C# bietet eine Lösung für dieses - es ist das using Konstrukt. Sie sollten es wie dieses Problem zu beheben:

using(var connection = new SqlConnection(connetionString)) { 
    connection.Open(); 
    ... // Rest of your code; Do not call connection.Close() 
} 

Da connection eingeschlossen in using, wird das Programm automatisch beim Verlassen des using Block schließt. Dies geschieht beim normalen Beenden, aber auch beim Verlassen einer Ausnahme, sodass Sie sich nicht darum kümmern müssen, zu fangen, zu schließen und erneut zu werfen.

0

die wahre Beratung von dasblinkenlight Hinzufügen legen Sie Ihre Schließen von Verbindungen aus for-Schleife und am Ende der for-Schleife setzen eine command1.parameters.clear (Sie haben alte Parameter löschen)

0

das Code-Snippet Sie haben geschrieben fehlt eine enge Klammer für die for-Schleife - es sollte sofort nach der Console.WriteLine(personnummer); folgen, aber wenn es nicht dann die folgende Linie ist, die die Verbindung schließt innerhalb der for Schleife und die Verbindung wird nach der ersten Iteration geschlossen werden, was den Fehler verursacht in der zweiten Iteration.

Verwandte Themen