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

C# C-执行查询时登录无效,c#,.net,sql-server,C#,.net,Sql Server,我是C语言新手,学习了查询的打开和关闭,现在我执行了正确的查询,但没有得到正确的输出。请告诉我如何解决这个问题谢谢 这是我的查询代码 SqlCommand cmd = new SqlCommand("Select * from users Where username = @username and password = @password", sqlcon); cmd.CommandType = CommandType.Text; cmd.Parameters.AddWithValue("@

我是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执行查询-这是无用的,应该删除ExecuteOnQuery适用于运行INSERT、UPDATE或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 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();
此外:丹·古兹曼说:-请阅读文章并停止使用它!使用常规参数。添加方法并定义参数的数据类型

另外:这看起来像是在数据库表中以纯文本形式存储密码。别这样!说真的,永远不要这样做。如果你必须存储密码,那么就需要进行散列和腌制-你会发现许多文章和博客文章都介绍了如何做到这一点-接受它吧

最后一点注意:由于您只想检查给定用户是否存在用户名和密码,因此返回Users表的所有列(仅返回UserId或其他一些小列)然后使用.ExecuteScalar就足够了,这真是太过分了。如果具有该用户名和密码的用户存在,则ExecuteScalar将返回其用户ID-如果该用户不存在,则返回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();

@你好,先生,我是学c的新手。对不起,我的代码行不正确,你能分享你的想法并编辑我的代码吗?谢谢,那太好了,但我会试试你说的话:主席先生,非常感谢,你的话很精彩,也很感谢你的建议。我要记住,ExecuteOnQuery仅用于插入更新删除,对于像我这样的初学者来说,学习c及其sql机制非常有用。我想我只是把代码放错地方了。