我正在使用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();
}
}
}
答案 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
}
如果成功和例外
,这将自动处理连接