2016-04-12 4 views
0

я получаю ошибкуExecuteNonQuery требует открытого подключения

ExecuteNonQuery kräver ан Оппен оч tillgänglig Connection. Anslutningens aktuella status är stängd.

При попытке запустить мой код. Я подумал, что я открыл и закрыл соединение соответственно.

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"); 

Можно ли найти что-то не так?

ответ

3

Ваш connection.Close() оказался в курсе, потому что вы забыли закрыть скобу. Выполняется только первая итерация, а вторая - из-за закрытого соединения.

Однако не спешите добавлять скобу и считайте ее исправленной. Это не было бы хорошим способом решения проблемы, потому что осталась бы другая проблема - вам нужно было бы закрыть закрытие соединения для исключения.

C# обеспечивает решение этого - это конструкция using. Вы должны исправить это следующим образом:

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

Поскольку connection заключена в using, программа закроется автоматически при выходе из using блока. Он будет делать это при нормальном выходе, но также и при выходе из исключения, поэтому вам не нужно беспокоиться о ловить, закрывать и повторно бросать.

0

Добавление истинный совет dasblinkenlight положить закрытие соединение из за петлю и в конце цикла для положить command1.parameters.clear (Вы должны очистить старые параметры)

0

Фрагмент код, вы выложили отсутствует замыкающая скобка для цикла for - она ​​должна быть сразу же после Console.WriteLine(personnummer);, но если это не так, следующая строка, которая закрывает соединение, будет находиться внутри цикла for, и соединение будет закрыто после первой итерации, вызывая ошибку на второй итерации.

Смежные вопросы