C# 连接未正确关闭ASP.NET C

C# 连接未正确关闭ASP.NET C,c#,asp.net,C#,Asp.net,我有这个按钮点击事件。尝试用不同的代码行替换con.Close,尝试了几个小时,但无法修复。也许第二双眼睛能帮上忙 错误:System.InvalidOperationException:'连接未关闭。连接的当前状态为“打开” 受保护的无效按钮1\u单击对象发送者,事件参数e { SqlConnection con=新的SqlConnection; con.ConnectionString=ConfigurationManager.ConnectionString[ConnStr].Connec

我有这个按钮点击事件。尝试用不同的代码行替换con.Close,尝试了几个小时,但无法修复。也许第二双眼睛能帮上忙

错误:System.InvalidOperationException:'连接未关闭。连接的当前状态为“打开”

受保护的无效按钮1\u单击对象发送者,事件参数e { SqlConnection con=新的SqlConnection; con.ConnectionString=ConfigurationManager.ConnectionString[ConnStr].ConnectionString; 不公开; 字符串查询=从类别中选择类别,其中C_UserName='+Session[id]+'和CATEGORY='+DropDownList1.SelectedItem.Value+'; SqlCommand cmd=newsqlcommandquery,con; SqlDataReader=cmd.ExecuteReader; 如果reader.HasRows { cmd.Parameters。AddWithValue@CATEGORY,DropDownList1.SelectedItem.Value; lblResult.Text=您已选择此类别。请选择一个新类别; con.关闭; } 其他的 { SqlCommand cmd1=新的SqlCommandUPDATE集合类别CCID@CCID类别,C_用户名,CCID值@CATEGORY,@C_用户名,@CCID,con; cmd1.Parameters.AddWithValueCATEGORY,DropDownList1.SelectedItem.Value; cmd1.Parameters.AddWithValueC_用户名,会话[id]; cmd1.Parameters.AddWithValueCCID,Label1.Text; 不公开; int i=cmd1.ExecuteNonQuery; con.关闭; 如果我!=0 { Label2.Text=您的数据已保存在数据库中; Label2.ForeColor=System.Drawing.Color.ForestGreen; } 其他的 { Label2.Text=选择出错; Label2.ForeColor=System.Drawing.Color.Red; } } }
请仅尝试此打开的连接一次,并仅关闭一次:

protected void Button1_Click(object sender, EventArgs e) {
  using(SqlConnection con = new SqlConnection()) {
    con.ConnectionString = ConfigurationManager.ConnectionStrings["ConnStr"].ConnectionString;

    string query = "SELECT CATEGORY FROM CATEGORY WHERE C_UserName = '" + Session["id"] + "'  AND  CATEGORY = '" + DropDownList1.SelectedItem.Value + "' ";
    SqlCommand cmd = new SqlCommand(query, con);
    con.Open();
    SqlDataReader reader = cmd.ExecuteReader();
    bool hasRows = reader.HasRows;
    reader.Close();
    if (hasRows) {
      // This line makes no sense after the execution of the query.
      //cmd.Parameters.AddWithValue("@CATEGORY", DropDownList1.SelectedItem.Value);
      
      lblResult.Text = "You have selected this category. Please select a new category";
    } else {
      SqlCommand cmd1 = new SqlCommand("UPDATE SET CATEGORY CCID@CCID (CATEGORY, C_USERNAME, CCID) VALUES (@CATEGORY, @C_USERNAME, @CCID)", con);
      cmd1.Parameters.AddWithValue("CATEGORY", DropDownList1.SelectedItem.Value);
      cmd1.Parameters.AddWithValue("C_USERNAME", Session["id"]);
      cmd1.Parameters.AddWithValue("CCID", Label1.Text);

      int i = cmd1.ExecuteNonQuery();

      if (i != 0) {

        Label2.Text = " Your data is been saved in the database";
        Label2.ForeColor = System.Drawing.Color.ForestGreen;

      } else {
        Label2.Text = "Something went wrong with selection";
        Label2.ForeColor = System.Drawing.Color.Red;

      }
    }
    con.Close();
  }
}
现在我们来讨论这一行

    string query = "SELECT CATEGORY FROM CATEGORY WHERE C_UserName = '" + Session["id"] + "'  AND  CATEGORY = '" + DropDownList1.SelectedItem.Value + "' ";

这让攻击者可以通过sql注入操作您的输入。要解决此问题,请使用相同的cmd1.Parameters.AddWithValueCATEGORY,DropDownList1.SelectedItem.Value;您在第二个查询中使用的。会话[id]有点安全,因为它不是由用户提供的,但比“抱歉”更安全,因为参数会清理输入并保护您免受sql注入的影响。

您应该在任何if.Remove con.Open之外使用或关闭连接;在这个世界里。这是不必要的。您打开了门一次,然后又试图打开它,门说对不起,我已经打开了;确保它总是处理它,即使是在出现异常的情况下。关闭不再是必需的,因为它发生在处置时,除非您想在退出代码块.UPDATE集合类别之前关闭CCID@CCID类别、C_用户名、CCID值@CATEGORY、@C_USERNAME、@CCID看起来不像有效的SQL。请从类别中选择类别,其中C_USERNAME='+Session[id]+'和CATEGORY='+DropDownList1.SelectedItem.Value+';SqlCommand cmd=newsqlcommandquery,con;不要那样做。公正的评论。我添加了一个部分来解释前进的方向。嗨@Athanasios Kataras,谢谢你为解释前进的方向所做的努力。我尝试了您提供的上述代码,不幸的是,System.InvalidOperationException出现错误:“已经有一个打开的DataReader与此命令关联,必须先关闭它。”在int I=cmd1.ExecuteOnQuery;检查更新的代码。