c# - 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 需要一个打开且可用的连接。连接的当前状态为关闭。
解决方案
您需要在.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();
推荐阅读
- php - 响应式显示 Bootstrap
- colors - 使用蓝光滤镜软件时为网站背景选择颜色
- flutter - 如何在 Flutter 中加载 http 请求之前禁用按钮?
- azure - azure 上的 .NET Core 3 Linux 应用程序中的 SSL 错误
- groovy - 如何在 groovy 断言中验证值是字符串还是 null
- php - Laravel - 比较数组并在数据不同时更新
- vue.js - 数据值仅在重新加载时加载,同时使用 VueJs v-bind
- linux - 在linux的另一个目录中创建指向文件的软链接
- php - strpos 不适用于搜索以 X 开头的术语
- stored-procedures - 如何在 DB2 函数中使用临时表