ExecuteNonQuery需要打开Connection

时间:2016-04-12 10:43:00

标签: c# sql-server

我收到错误

  

ExecuteNonQuery免费下载   Anslutningens aktuellastatusä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 个答案:

答案 0 :(得分: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块时自动关闭它。它会在正常退出时执行,但也会在退出异常时执行,因此您不必担心捕获,关闭和重新抛出。

答案 1 :(得分:0)

添加dasblinkenlight的真实建议将你的结束连接放在for循环之外,在for循环结束时放一个command1.parameters.clear(你必须清除旧的参数)

答案 2 :(得分:0)

您发布的代码段缺少for循环的紧密括号 - 它应该紧跟在Console.WriteLine(personnummer);之后但如果不是,则关闭连接的以下行将在内部for循环和连接将在第一次迭代后关闭,导致第二次迭代出错。