C# ExecuteReader需要打开且可用的连接,但该连接已打开且不工作

C# ExecuteReader需要打开且可用的连接,但该连接已打开且不工作,c#,sql,asp.net,C#,Sql,Asp.net,我有一张登录表。我的查询在我的数据库中运行,并交叉检查输入的参数是否与数据库中的参数匹配,然后将您重定向到页面。我在代码中设置了一个条件,以便在连接打开或关闭时捕获异常。我尝试过寻找像这样或其他的解决方案 我已经做了以下工作 包括使用 但是,它仍然在运行时显示此错误 ExecuteReader需要打开且可用的连接。连接的当前状态为关闭 这是我的代码: public void LWAPLogin(string username, string password) { str

我有一张登录表。我的查询在我的数据库中运行,并交叉检查输入的参数是否与数据库中的参数匹配,然后将您重定向到页面。我在代码中设置了一个条件,以便在连接打开或关闭时捕获异常。我尝试过寻找像这样或其他的解决方案

我已经做了以下工作

包括使用 但是,它仍然在运行时显示此错误

ExecuteReader需要打开且可用的连接。连接的当前状态为关闭

这是我的代码:

public void LWAPLogin(string username, string password)
    {
        string wrongCredentials = "Username does not exist. Or password is incorrect";
        string query = "Select Username, Password from LWAP where Username=@user AND Password=@password;";
        using (SqlCommand command = new SqlCommand(query, Connect.con))
        {
            command.Parameters.Add("@user", SqlDbType.VarChar, 50).Value = username;
            command.Parameters.Add("@password", SqlDbType.VarChar, 50).Value = password;

            try
            {
                if (connection.con.State == ConnectionState.Open)
                {
                    using (SqlDataReader dr = command.ExecuteReader())
                    {
                        if (dr.Read())
                            Response.Redirect("LWAPHome.aspx");
                        else
                            ClientScript.RegisterStartupScript(this.GetType(), "myalert", "alert('" + wrongCredentials + "');", true);

                        dr.Close();
                    }
                    connection.con.Close();
                }


                else if (connection.con.State == ConnectionState.Closed)
                {
                    connection.con.Open();


                    using (SqlDataReader dr = command.ExecuteReader())
                    {
                        if (dr.Read())
                            Response.Redirect("LWAPHome.aspx");
                        else
                            ClientScript.RegisterStartupScript(this.GetType(), "myalert", "alert('" + wrongCredentials + "');", true);
                        dr.Close();
                    }
                    connection.con.Close();

                }
            }
            finally
            {
                //connection.con.Open();
            }
        }

    }
在得到其他程序员的建议之后。我更改了代码,问题得到了解决。但是现在我有一个新问题。当一切正常但情况不好时,它应该重定向到新页面。只需将页面url更改为所需页面,但保留在登录页面上

下面是我编辑的代码:

public void LWAPLogin(string username, string password)
    {
        using (SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["tlcString"].ConnectionString))
        {
            string wrongCredentials = "Username does not exist. Or password is incorrect";
            string query = "Select Username, Password from LWAP where Username=@user AND Password=@password;";
            using (SqlCommand command = new SqlCommand(query, con))
            {

                command.Parameters.Add("@user", SqlDbType.VarChar, 50).Value = username;
                command.Parameters.Add("@password", SqlDbType.VarChar, 50).Value = password;

                con.Open();

                using (SqlDataReader dr = command.ExecuteReader())
                {
                    if (dr.Read())
                        Response.Redirect("LWAPHome.aspx");
                    else
                        ClientScript.RegisterStartupScript(this.GetType(), "myalert", "alert('" + wrongCredentials + "');", true);

                    dr.Close();
                }
                //connection.con.Close();
            }
            con.Close();

        }
    }

有关当前显示的错误,请参阅。我尝试使用不同的浏览器,但它们都做相同的事情

您正在创建一个新的SqlCommandquery,Connect.con指定Connect.con作为要使用的连接,而您正在检查connection.con(另一个SqlConnection实例)的状态。如果确实要检查任何内容,请确保检查的内容正确。

为什么要重用SqlConnection?这导致了这些问题。而是在每个方法中使用using语句来创建和初始化它。可能相关:您可能遇到了一个计时问题,您的连接可能会关闭。。。所以它没有关闭..所以我应该使用using并在using中声明连接?我应该继续调节我的查询,否则它将变得不必要吗?它似乎是web应用程序,您可能将连接存储在某个静态字段中。所以,当一个请求传入时,检查连接是否打开并尝试执行命令——另一个请求可能会关闭其间的连接。如上所述-千万不要这样做,每次创建新连接都不会真正创建到数据库的新连接,因为连接存储在池中。同样奇怪的是,您有两个连接:1 Connect.con 2 connection.con。然而,两者都不应该是静态的!否则,我上面的链接不是相关的,而是重复的。不,问题没有持续。最初提出的问题得到了回答。代码中还有其他问题。堆栈溢出并不是让你的代码完全调试,而是回答一个问题,让其他人从这个问题及其答案中受益。通过改变问题,你模糊了原来的问题,并挫败了这个目的。正如Tim Schmelter指出的,请将此问题标记为已回答,并为下一个问题创建一个新问题。