为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
qq_笑_17 2023-08-20 15:28:28
我是 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 需要一个打开且可用的连接。连接的当前状态已关闭。
查看完整描述

1 回答

?
慕码人8056858

TA贡献1803条经验 获得超6个赞

你需要在 -.ExecuteReader() 之后 sqlcon.Open()调用- 为什么你还要执行.ExecuteNonQuery()?您已经通过调用执行查询.ExecuteReader()- 这是无用的,应该删除(ExecuteNonQuery适用于运行INSERT, UPDATEor 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()。如果具有该用户名和密码的用户存在,则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();


查看完整回答
反对 回复 2023-08-20
  • 1 回答
  • 0 关注
  • 110 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信