System.InvalidOperationException:'连接未关闭'

时间:2018-06-06 08:52:49

标签: c# sql sql-server winforms

我正在使用C#Form和SQL Server。登录时我遇到了问题。

  

" System.InvalidOperationException:'连接未关闭'。

我无法解决这个问题。我想我添加了很多" con.Open()"。但我尝试了很多方法,但我仍然采取这个错误。猜猜,我删除了一个更开放和关闭,是真的吗?

private void buttonLogin_Click(object sender, EventArgs e)
{
    con.Open();

    if (String.IsNullOrEmpty(textBoxUserName.Text))
    {
        MessageBox.Show("Username can't be empty");
        textBoxUserName.Focus();
        con.Close();
    }
    if (String.IsNullOrEmpty(textBoxPassword.Text))
    {
        MessageBox.Show("Password can't be empty");
        textBoxPassword.Focus();
        con.Close();
    }

    else
    {
        con.Open();
        SqlCommand SelectCommand = new SqlCommand("SELECT * FROM Users WHERE  username ='" + textBoxUserName.Text.Trim() + "' and password= '" + textBoxPassword.Text.Trim() + "'");
        SqlDataReader myReader;
        myReader = SelectCommand.ExecuteReader();
        int count = 0;
        string userRole = string.Empty;
        while (myReader.Read())
        {
            count = count + 1;
            userRole = myReader["userrank"].ToString();
        }

        if (count == 1)
        {

            if (userRole =="admin" )
            {
                Form1 form = new Form1();
                this.Hide();
                form.Show();
                con.Close();
            }
            else
            {
                UI ui = new UI();
                this.Hide();
                ui.Show();
                con.Close();
            }
            myReader.Close();
        }
        else
        {
            MessageBox.Show("Check your username or password");
            con.Close();
        }           
    }       
}

3 个答案:

答案 0 :(得分:2)

您可以在打开连接之前检查状态 - 因为打开打开的连接会失败。

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

旁注:最佳做法是

string command = "SELECT * FROM Users WHERE  username = @username and password = @password";
using (SqlConnection con = new SqlConnection(ConnectionString))
{
    con.Open();
    using (SqlCommand cmd = new SqlCommand(command, con))
    {
        cmd.Parameters.Add("@username", SqlDbType.VarChar).Value = textBoxUserName.Text.Trim();
        cmd.Parameters.Add("@password", SqlDbType.VarChar).Value = textBoxPassword.Text.Trim();
        using (SqlDataReader reader = cmd.ExecuteReader())
        {
            while (reader.Read())
            {
                count = count + 1;
                userRole = myReader["userrank"].ToString();
            }
        }
    }
}
  • 使用using您不必关心状态,关闭和处理连接
  • 使用参数来避免注入攻击

答案 1 :(得分:0)

好像你有一些冗余的代码。无需在开始时打开连接,稍后再次关闭它而无需使用连接。

如果它碰到你的第一个 if ,它似乎也会点击你的 else 语句。

我认为下面的代码可以解决您的问题,可以通过点击第一个 if 语句来关闭 con 对象。假设您当然已全局实例化 con 对象。

private void buttonLogin_Click(object sender, EventArgs e)
{
    if (String.IsNullOrEmpty(textBoxUserName.Text))
    {
        MessageBox.Show("Username can't be empty");
        textBoxUserName.Focus();
    }
    else if (String.IsNullOrEmpty(textBoxPassword.Text))
    {
        MessageBox.Show("Password can't be empty");
        textBoxPassword.Focus();
    }
    else
    {
        using (SqlConnection con = new SqlConnection(ConnectionString))
        {
            SqlCommand SelectCommand = new SqlCommand("SELECT * FROM Users WHERE  
            username ='" + textBoxUserName.Text.Trim() + "' and password= '" + textBoxPassword.Text.Trim() + "'");
            SqlDataReader myReader;
            myReader = SelectCommand.ExecuteReader();
            int count = 0;
            string userRole = string.Empty;
            while (myReader.Read())
            {
                count = count + 1;
                userRole = myReader["userrank"].ToString();
            }

            if (count == 1)
            {

                if (userRole =="admin" )
                {
                    Form1 form = new Form1();
                    this.Hide();
                    form.Show();
                    con.Close();
                }
                else
                {
                    UI ui = new UI();
                    this.Hide();
                    ui.Show();
                    con.Close();
                }
                myReader.Close();
            }
            else
            {
                MessageBox.Show("Check your username or password");
                con.Close();
            }           
        } 
    }      
}

答案 2 :(得分:0)

使用构造。

using (con)
{
  //do your work
}

如果成功和例外

,这将自动处理连接