首页 > 解决方案 > 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 需要一个打开且可用的连接。连接的当前状态为关闭。

标签: c#.netsql-server

解决方案


您需要在.ExecuteReader() 之后 sqlcon.Open()调用- 为什么还要执行.ExecuteNonQuery()?您已经通过调用来执行查询.ExecuteReader()- 这是无用的,应该被删除(ExecuteNonQuery适用于运行INSERT,UPDATE或的 SQL 语句DELETE- 但不适用于您在这里有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(). 如果具有该用户名和密码的用户存在,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 exists
if (result != null)
{
    Main objMain = new Main();
    this.Hide();
    objMain.Show();
}
else
{
    MessageBox.Show("Check your username and password");
}   

sqlcon.Close();

推荐阅读