2016-04-12 19 views
0

私はエラーは、ExecuteNonQueryはオープン接続

は、ExecuteNonQuerykräverエンöppenOCHのtillgänglig接続を取得する必要があります。 ステータスを保持しています。

私のコードを実行しようとしています。私はそれに応じて接続を開いて閉じたと思った

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()は閉じ括弧を忘れているため、ループ内に表示されます。最初の反復だけが成功し、2番目の反復は閉じられた接続のため失敗します。

ただし、ブレースを追加して固定しているとは思わないでください。これは、問題を解決する良い方法ではありません。なぜなら、別の問題が残るからです。例外で接続を閉じることに対処する必要があります。

C#はこの解決策を提供します。これはusingです。あなたはこのようにそれを修正する必要があります。connection以来

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

usingに囲まれて、プログラムはusingブロックを出る際に、自動的に閉じます。通常の終了時にも例外なく終了しますので、キャッチ、クローズ、再スローを心配する必要はありません。 dasblinkenlightの真の助言を追加

0

は、forループとforループの終わりのうち、あなたの終値の接続がcommand1.parameters.clearを入れて置く(あなたが古いパラメータを消去する必要がある)

0

コードあなたが投稿したスニペットforループのための中かっこがありません - それはConsole.WriteLine(personnummer);の直後にあるはずですが、そうでなければ、接続を閉じる次のラインはforループ内にあり、最初の反復の後に接続が閉じられ、エラーが発生します2番目の反復で

関連する問題