我是 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 需要一个打开且可用的连接。连接的当前状态是关闭的。
您需要在.ExecuteReader()
之后 调用sqlcon.Open()
- 为什么还要执行.ExecuteNonQuery()
?? 您已经通过调用执行查询.ExecuteReader()
- 这是无用的,应该删除(ExecuteNonQuery
适用于运行INSERT
, UPDATE
or 的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();
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句