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 需要一个开放且可用的连接。连接的当前状态为关闭。

您需要在sqlcon.Open()之后调用.ExecuteReader()- 为什么你也执行.ExecuteNonQuery()?您已经通过调用.ExecuteReader()执行查询 - 这是无用的,应该删除(ExecuteNonQuery用于运行INSERTUPDATEDELETE的 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 rows
SqlDataReader 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();

此外:Dan Guzman 说:"AddWithValue 是邪恶的" - 请阅读文章并停止使用它!使用常规Parameters.Add()方法并定义参数的数据类型!

另外:这看起来像您以纯文本形式将密码存储在数据库表中。别这样!说真的 - 永远不要这样做。如果您必须存储密码,则需要散列和加盐- 您会发现许多关于如何执行此操作的文章和博客文章 -拥抱它!

最后一点:由于您只想使用用户名和密码检查给定用户是否存在,因此返回Users表的所有确实是矫枉过正 - 仅返回例如UserId(或其他一些小列(就足够了 - 然后使用.ExecuteScalar().如果存在具有该用户名和密码的用户,则ExecuteScalar()返回其UserId- 如果该用户不存在,则将返回 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 exists
if (result != null)
{
Main objMain = new Main();
this.Hide();
objMain.Show();
}
else
{
MessageBox.Show("Check your username and password");
}   
sqlcon.Close();

最新更新