2016-04-12 32 views
0

我得到的錯誤的ExecuteNonQuery需要一個打開的連接

的ExecuteNonQuerykräver連接öppenOCHtillgänglig連接。 Anslutningens aktuella statusärstä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的真正建議把你的關閉連接出的for循環,並在for循環結束時把command1.parameters.clear(你要清楚舊參數)

0

的代碼片段您已經發布缺少一個用於for循環的緊鄰括號 - 它應該緊跟在Console.WriteLine(personnummer);之後,但是如果不是,那麼關閉連接的下一行將在for循環內,並且連接將在第一次迭代之後關閉,從而導致錯誤在第二次迭代。

相關問題