C# - 执行查询时登录无效

我是 C# 新手,正在学习查询打开和关闭,现在我执行正确的查询,但没有获得正确的输出。请告诉我如何解决这个问题,谢谢。


这是我的查询代码。


SqlCommand cmd = new SqlCommand("Select * from users Where username = @username and password = @password", sqlcon);

cmd.CommandType = CommandType.Text;


cmd.Parameters.AddWithValue("@username", txtUsername.Text);

cmd.Parameters.AddWithValue("@password", txtPassword.Text);


SqlDataReader dr = cmd.ExecuteReader();


sqlcon.Open();

cmd.ExecuteNonQuery();

sqlcon.Close();


if (dr.HasRows)

{

    Main objMain = new Main();

    this.Hide();

    objMain.Show();

}

else

{

    MessageBox.Show("Check your username and password");

}

我收到这个错误


System.InvalidOperationException:'ExecuteReader 需要一个打开且可用的连接。连接的当前状态已关闭。


qq_笑_17
浏览 111回答 1
1回答

慕码人8056858

你需要在 -.ExecuteReader() 之后 sqlcon.Open()调用- 为什么你还要执行.ExecuteNonQuery()?您已经通过调用执行查询.ExecuteReader()- 这是无用的,应该删除(ExecuteNonQuery适用于运行INSERT, UPDATEor DELETE- 的 SQL 语句,但不适用于您在这里有类似情况的情况SELECT...)。SqlCommand cmd = new SqlCommand("SELECT * FROM users WHERE username = @username AND password = @password", sqlcon);cmd.Parameters.Add("@username", SqlDbType.VarChar, 100).Value = txtUsername.Text);cmd.Parameters.Add("@password", SqlDbType.VarChar, 100).Value = txtPassword.Text;// open connection    sqlcon.Open();// execute reader and iterate over rowsSqlDataReader dr = cmd.ExecuteReader();if (dr.HasRows){    Main objMain = new Main();    this.Hide();    objMain.Show();}else{    MessageBox.Show("Check your username and password");}   // close connection only **AFTER** you've read the data!sqlcon.Close();由于您只想检查给定用户是否存在用户名和密码,因此返回表的所有列确实是一种矫枉过正 - 仅返回例如(或其他一些列)Users就足够了UserId,小栏) - 然后使用.ExecuteScalar()。如果具有该用户名和密码的用户存在,则UserId返回ExecuteScalar()该用户名和密码 - 如果该用户不存在,则返回 NULL。像这样的东西:SqlCommand cmd = new SqlCommand("SELECT UserId FROM users WHERE username = @username AND password = @password", sqlcon);cmd.Parameters.Add("@username", SqlDbType.VarChar, 100).Value = txtUsername.Text);cmd.Parameters.Add("@password", SqlDbType.VarChar, 100).Value = txtPassword.Text;// open connection    sqlcon.Open();// execute scalar object result = cmd.ExecuteScalar();// if we got a result --> user with that username nad password existsif (result != null){    Main objMain = new Main();    this.Hide();    objMain.Show();}else{    MessageBox.Show("Check your username and password");}   sqlcon.Close();
打开App,查看更多内容
随时随地看视频慕课网APP