C# 连接没有关闭。连接';的当前状态是打开的。(错误)

C# 连接没有关闭。连接';的当前状态是打开的。(错误),c#,database,connection,C#,Database,Connection,连接没有关闭。连接的当前状态为“打开”。(错误) 这是我的错误。 这里有一张照片: 是的,我做了一个连接字符串,但它在我的公共部分类中 如果有人在说我使用的语言:荷兰语:) 这是我的代码: private void btnOpslaanwerknemergegevens_Click(object sender, EventArgs e) { SqlCommand scmdNaam, scmdVoornaam, scmdStraat, scmdHuisnr, scmdPo

连接没有关闭。连接的当前状态为“打开”。(错误) 这是我的错误。 这里有一张照片: 是的,我做了一个连接字符串,但它在我的公共部分类中

如果有人在说我使用的语言:荷兰语:)

这是我的代码:

private void btnOpslaanwerknemergegevens_Click(object sender, EventArgs e)
    {

        SqlCommand scmdNaam, scmdVoornaam, scmdStraat, scmdHuisnr, scmdPostcode, scmdGemeente, scmdBurgerlijkestand, scmdGeboorte_datum, scmdKinderen_ten_laste, scmdAfdeling, scmdIn_dienst_sinds, scmdGewest, scmdMinder_valide, scmdMinder_valide_partner, scmdMinder_valide_kinderen, scmdInkomen_partner, scmdEmail, scmdTel_nr, scmdGsm_nr;

        // new sqlcommands
        scmdNaam = new SqlCommand();
        scmdVoornaam = new SqlCommand();
        scmdStraat = new SqlCommand();
        scmdHuisnr = new SqlCommand();
        scmdPostcode = new SqlCommand();
        scmdGemeente = new SqlCommand();
        scmdBurgerlijkestand = new SqlCommand();
        scmdGeboorte_datum = new SqlCommand();
        scmdKinderen_ten_laste = new SqlCommand();
        scmdAfdeling = new SqlCommand();
        scmdIn_dienst_sinds = new SqlCommand();
        scmdGewest = new SqlCommand();
        scmdMinder_valide = new SqlCommand();
        scmdMinder_valide_kinderen = new SqlCommand();
        scmdMinder_valide_partner = new SqlCommand();
        scmdInkomen_partner = new SqlCommand();
        scmdEmail = new SqlCommand();
        scmdTel_nr = new SqlCommand();
        scmdGsm_nr = new SqlCommand();

        //sqlcommand.connections
        scmdNaam.Connection = loonberekening;
        scmdVoornaam.Connection = loonberekening;
        scmdStraat.Connection = loonberekening;
        scmdHuisnr.Connection = loonberekening;
        scmdPostcode.Connection = loonberekening;
        scmdGemeente.Connection = loonberekening;
        scmdBurgerlijkestand.Connection = loonberekening;
        scmdGeboorte_datum.Connection = loonberekening;
        scmdKinderen_ten_laste.Connection = loonberekening;
        scmdAfdeling.Connection = loonberekening;
        scmdIn_dienst_sinds.Connection = loonberekening;
        scmdGewest.Connection = loonberekening;
        scmdMinder_valide.Connection = loonberekening;
        scmdMinder_valide_kinderen.Connection = loonberekening;
        scmdMinder_valide_partner.Connection = loonberekening;
        scmdInkomen_partner.Connection = loonberekening;
        scmdEmail.Connection = loonberekening;
        scmdTel_nr.Connection = loonberekening;
        scmdTel_nr.Connection = loonberekening;

        scmdNaam.CommandText = "UPDATE werknemer SET naam = \'" + txtNaam.Text + "\' WHERE ID = \'" + _id + "\'";
        scmdVoornaam.CommandText = "UPDATE werknemer SET voornaam = \'" + txtVoornaam.Text + "\' WHERE ID = \'" + _id + "\'";
        scmdStraat.CommandText = "UPDATE werknemer SET straat = \'" + txtStraat.Text + "\' WHERE ID = \'" + _id + "\'";
        scmdHuisnr.CommandText = "UPDATE werknemer SET huisnr = \'" + txtStraatnr.Text + "\' WHERE ID = \'" + _id + "\'";
        scmdPostcode.CommandText = "UPDATE werknemer SET postcode = \'" + txtPostcode.Text + "\' WHERE ID = \'" + _id + "\'";
        scmdGemeente.CommandText = "UPDATE werknemer SET gemeente = \'" + txtGemeente.Text + "\' WHERE ID = \'" + _id + "\'";
        scmdBurgerlijkestand.CommandText = "UPDATE werknemer SET burgerlijkestand = \'" + cbxStand.Text + "\' WHERE ID = \'" + _id + "\'";
        scmdGeboorte_datum.CommandText = "UPDATE werknemer SET geboorte_datum = \'" + txtGeboortedatum.Text + "\' WHERE ID = \'" + _id + "\'";
        scmdKinderen_ten_laste.CommandText = "UPDATE werknemer SET kinderen_ten_laste = \'" + txtKinderentenlaste.Text + "\' WHERE ID = \'" + _id + "\'";
        scmdAfdeling.CommandText = "UPDATE werknemer SET afdeling = \'" + txtAfdeling.Text + "\' WHERE ID = \'" + _id + "\'";
        scmdIn_dienst_sinds.CommandText = "UPDATE werknemer SET in_dienst_sinds = \'" + txtIndien.Text + "\' WHERE ID = \'" + _id + "\'";
        scmdGewest.CommandText = "UPDATE werknemer SET Gewest = \'" + cbxGewest.Text + "\' WHERE ID = \'" + _id + "\'";
        scmdMinder_valide.CommandText = "UPDATE werknemer SET minder_valide= \'" + cbxValide.Text + "\' WHERE ID = \'" + _id + "\'";
        scmdMinder_valide_kinderen.CommandText = "UPDATE werknemer SET minder_valide_kinderen = \'" + txtHoeveelvalidekinderen.Text + "\' WHERE ID = \'" + _id + "\'";
        scmdMinder_valide_partner.CommandText = "UPDATE werknemer SET minder_valide_partner = \'" + cbxPartner.Text + "\' WHERE ID = \'" + _id + "\'";
        scmdInkomen_partner.CommandText = "UPDATE werknemer SET inkomen_partner = \'" + txtInkomenpartner.Text + "\' WHERE ID = \'" + _id + "\'";
        scmdEmail.CommandText = "UPDATE werknemer SET [e-mail] = \'" + txtEmail.Text + "\' WHERE ID = \'" + _id + "\'";
        scmdTel_nr.CommandText = "UPDATE werknemer SET tel_nr = \'" + txtTelefoonnr.Text + "\' WHERE ID = \'" + _id + "\'";
        scmdGsm_nr.CommandText = "UPDATE werknemer SET gsm_nr = \'" + txtGsmNr.Text + "\' WHERE ID = \'" + _id + "\'";




        loonberekening.Open();
        txtNaam.Text = Convert.ToString(scmdNaam.ExecuteScalar());
        txtVoornaam.Text = Convert.ToString(scmdVoornaam.ExecuteScalar());
        txtStraat.Text = Convert.ToString(scmdStraat.ExecuteScalar());
        txtStraatnr.Text = Convert.ToString(scmdHuisnr.ExecuteScalar());
        txtPostcode.Text = Convert.ToString(scmdPostcode.ExecuteScalar());
        txtGemeente.Text = Convert.ToString(scmdGemeente.ExecuteScalar());
        cbxStand.Text = Convert.ToString(scmdBurgerlijkestand.ExecuteScalar());
        txtGeboortedatum.Text = Convert.ToString(scmdGeboorte_datum.ExecuteScalar());
        txtKinderentenlaste.Text = Convert.ToString(scmdKinderen_ten_laste.ExecuteScalar());
        txtAfdeling.Text = Convert.ToString(scmdAfdeling.ExecuteScalar());
        txtIndien.Text = Convert.ToString(scmdIn_dienst_sinds.ExecuteScalar());
        cbxGewest.Text = Convert.ToString(scmdGewest.ExecuteScalar());
        cbxValide.Text = Convert.ToString(scmdMinder_valide.ExecuteScalar());
        txtHoeveelvalidekinderen.Text = Convert.ToString(scmdMinder_valide_kinderen.ExecuteScalar());
        cbxPartner.Text = Convert.ToString(scmdMinder_valide_partner.ExecuteScalar());
        txtInkomenpartner.Text = Convert.ToString(scmdEmail.ExecuteScalar());
        txtEmail.Text = Convert.ToString(scmdEmail.ExecuteScalar());
        txtTelefoonnr.Text = Convert.ToString(scmdTel_nr.ExecuteScalar());
        txtGsmNr.Text = Convert.ToString(scmdGsm_nr.ExecuteScalar());
        loonberekening.Close();

这听起来像是Loonbeekening在Btnopslaanwerknemergevens_Click之外打开的,从未关闭过。如果没有更多的代码,很难说清楚,但我猜你有Loonbeekening有一个共享变量,因为btnopslanwerknemergevens\u Click似乎没有创建它。可能在调用btnOpslaanwerknemergegevens_Click之前它已经打开了。我建议在BTNOPSLAANWERKNEMERGEVENS\u单击中创建一个新连接。

您的方法不正确。UPDATE命令一次可以更新多个字段。因此,您需要将更新命令文本更改为如下内容

注意:这是伪代码,您需要填写点

private void btnOpslaanwerknemergegevens_Click(object sender, EventArgs e)
{
    string cmdText = @"UPDATE werknemer 
                       SET naam = @nam, 
                       voornaam = @voornaam,
                       .... continue with other fields 
                       .... and finish with
                       WHERE ID = @id";
    using(SqlConnection con = new SqlConnection(.... connectionstring ....))
    using(SqlCommand cmd = new SqlCommand(cmdText, con))
    {
         con.Open();
         cmd.Parameters.Add("@naam", SqlDbType.NVarChar).Value = txtNaam.Text; 
         cmd.Parameters.Add("@vornaam", SqlDbType.NVarChar).Value = txtVoornaam.Text; 
         ... continue adding a parameter for every field value .....    
         ... and finally call ...
         cmd.ExecuteNonQuery();
   }
}


在这个伪代码中,连接不是一个全局对象,但它是使用using语句在本地创建的,在出现异常时,using语句也会关闭并处理连接。然后,使用参数占位符(@xxxx)生成命令文本,最后,在用要传递给数据库引擎的值填充参数集合以替换占位符后,只执行一个命令。

您容易受到攻击。在总体方案中,为什么要定义所有这些更新查询?当您只能运行一个查询时,运行多个查询是非常浪费的<代码>更新foo集合字段=值,字段=值,字段=值。。。。其中id=$id的效率要高得多。在一个方法中创建所有sqlcommand对象有什么原因吗。。将其分解为更小的单个函数。。也不要问你能做什么。。您是否考虑过使用调试器。。?如果是这样,您将很快看到需要在何处进行修改/更改。此外,我建议将该代码放入存储过程中,并根据与流程相关的事件顺序,将其绘制在纸上,然后开始为您尝试执行的每个sql命令创建单独的方法/函数。。这是非常草率的…谢谢你的帮助,但我得到了这个错误,然后:(图片)非常感谢,但我需要把它放在哪里?在loonberekening.close()下;?或者我需要删除Loonbeekening.open&close(很抱歉,我在这方面做得很糟糕)你可以用这3行替换open语句:=)你不能打开一个已经打开的连接,所以你可以检查连接的状态,只有在需要的时候才打开它…像这样吗?因为我仍然收到相同的错误:连接未关闭。连接的当前状态为“打开”。(错误);达曼。。所以你的连接处于另一种状态。然后关闭或打开:=)那更好:=)
private void btnOpslaanwerknemergegevens_Click(object sender, EventArgs e)
{
    string cmdText = @"UPDATE werknemer 
                       SET naam = @nam, 
                       voornaam = @voornaam,
                       .... continue with other fields 
                       .... and finish with
                       WHERE ID = @id";
    using(SqlConnection con = new SqlConnection(.... connectionstring ....))
    using(SqlCommand cmd = new SqlCommand(cmdText, con))
    {
         con.Open();
         cmd.Parameters.Add("@naam", SqlDbType.NVarChar).Value = txtNaam.Text; 
         cmd.Parameters.Add("@vornaam", SqlDbType.NVarChar).Value = txtVoornaam.Text; 
         ... continue adding a parameter for every field value .....    
         ... and finally call ...
         cmd.ExecuteNonQuery();
   }