连接没有关闭。连接的当前状态是打开c#asp.net

时间:2015-10-16 19:28:42

标签: c# ado.net

我有一个asp.net Web应用程序,它使用ado.net连接到数据库。 我有一个类级变量与我的连接,然后我打开我的连接,然后我做了命令的提示,我正确地关闭了这个,但我的连接出错了。我把错误的图像放了。

Image of the runtime error

    SqlConnection sc = new    SqlConnection(ConfigurationManager.ConnectionStrings["DBCS"].ConnectionString);
    protected void Page_Load(object sender, EventArgs e)
    {


            string studentid = Session["student_id"].ToString();

        string i = studentid;
        sc.Open();
        SqlCommand cmd = new SqlCommand("atend", sc);
        cmd.CommandType = System.Data.CommandType.StoredProcedure;
        cmd.Parameters.AddWithValue("@rollno", studentid);
        SqlDataReader rdr = cmd.ExecuteReader();

        string subject;
        DataTable table = new DataTable();
        table.Columns.Add("Subject Name");
        table.Columns.Add("Total Lectures");
        table.Columns.Add("Attend Lectures");
        while (rdr.Read())
        {
            DataRow dataRow = table.NewRow();
            dataRow["subject Name"] = rdr["subject_id"];
            subject = rdr["subject_id"].ToString();
            dataRow["Total Lectures"] = gettotalatlectures(subject, studentid);
            dataRow["Attend Lectures"] = getattendance(subject, studentid);
            table.Rows.Add(dataRow);
        }
        sc.Close();
        GridView1.DataSource = table;
        GridView1.DataBind();   
    }

    public int getattendance(string sub, string rollno)
    {
        SqlCommand cmd=new SqlCommand("Select active from attendance where a_user_id='rollno' AND a_subject_code='sub'",sc);
        sc.Open();
        SqlDataReader rdr = cmd.ExecuteReader();
        int present=0;
        while (rdr.Read())
        {
            string x = rdr["active"].ToString();
            if (x == "True")
            {
                present++;
            }

        }
        sc.Close();
        return present;

    }
    public int gettotalatlectures(string sub, string rollno)
    {

        SqlCommand cmd = new SqlCommand("Select count(*) from attendance where a_user_id='rollno' AND a_subject_code='sub'", sc);
        sc.Open();
        int x = Convert.ToInt32(cmd.ExecuteScalar());
        sc.Close();
        return x;

    }

4 个答案:

答案 0 :(得分:1)

言论自我解释。

当您输入dataRow["Total Lectures"] = gettotalatlectures(subject, studentid);时,连接已打开。

所以当你尝试打开相同的连接时,他会给出这个错误。 而不是打开第二个连接甚至第二个命令,我建议改进您的查询或存储过程(see join / group by / with / ...)以返回此信息。

这将为您节省时间和麻烦。

答案 1 :(得分:0)

您正在尝试打开已打开的连接。检查您的方法 gettotalatlectures getattendance 。 删除这些方法的打开和关闭。 像这样:

public int gettotalatlectures(string sub, string rollno)
    {

        SqlCommand cmd = new SqlCommand("Select count(*) from attendance where a_user_id='rollno' AND a_subject_code='sub'", sc);
        int x = Convert.ToInt32(cmd.ExecuteScalar());
        return x;

    }

public int getattendance(string sub, string rollno)
{
    SqlCommand cmd=new SqlCommand("Select active from attendance where a_user_id='rollno' AND a_subject_code='sub'",sc);
    SqlDataReader rdr = cmd.ExecuteReader();
    int present=0;
    while (rdr.Read())
    {
        string x = rdr["active"].ToString();
        if (x == "True")
        {
            present++;
        }

    }
    return present;

}

答案 2 :(得分:0)

在您的代码中存在许多问题,但最重要的是保留全局连接对象。应该不惜一切代价避免这种情况,因为它会引入一些简单的错误,例如您现在遇到的错误,以及由于资源未释放到操作系统而导致非常难以发现的错误导致的更微妙的问题

我只打开SqlConnection一次,将所有内容都包含在using语句中

protected void Page_Load(object sender, EventArgs e)
{
    string studentid = Session["student_id"].ToString();
    string i = studentid;
    using(SqlConnection sc = new SqlConnection(ConfigurationManager.ConnectionStrings["DBCS"].ConnectionString))
    using(SqlCommand cmd = new SqlCommand("atend", sc))
    {
        sc.Open();
        cmd.CommandType = System.Data.CommandType.StoredProcedure;
        cmd.Parameters.AddWithValue("@rollno", studentid);
        using(SqlDataReader rdr = cmd.ExecuteReader())
        {
            .... 
           while (rdr.Read())
           {
              ...
              dataRow["Total Lectures"] = gettotalatlectures(sc, subject, studentid);
              dataRow["Attend Lectures"] = getattendance(sc, subject, studentid);
              table.Rows.Add(dataRow);
           }
      }
    }
    GridView1.DataSource = table;
    GridView1.DataBind();   
}

public int getattendance(SqlConnection sc, string sub, string rollno)
{
    using(SqlCommand cmd=new SqlCommand("Select active from attendance where a_user_id='rollno' AND a_subject_code='sub'",sc))
    using(SqlDataReader rdr = cmd.ExecuteReader())
    {
       .....
    }
    return present;
}
public int gettotalatlectures(SqlConnection sc, string sub, string rollno)
{
    using(SqlCommand cmd = new SqlCommand("Select count(*) from attendance where a_user_id='rollno' AND a_subject_code='sub'", sc))
    {
        int x = Convert.ToInt32(cmd.ExecuteScalar());

        return x;
    }
}

通过这种方式,在页面加载中,您可以创建并打开连接,使用它并将其传递给需要它的方法。当从异常块退出时,using语句也将关闭并处理连接(以及其他一次性对象,如SqlCommand和SqlDataReader),如果出现异常

请注意,此代码是在每次回调时执行的,因为您没有检查IsPostback,但这是另一个故事。

答案 3 :(得分:0)

问题解决了在web.config文件中进行简单更改 我添加了connectionstring MultipleActiveResultSets = True ,代码运行成功...