通过c#表单登录表单
本文关键字:表单 登录 通过 | 更新日期: 2023-09-27 18:18:50
我正在为我的应用程序构建一个使用c#表单的登录页面。到目前为止,我已经实现了如何使用特定的用户名和散列密码插入用户名。现在为了检索它,我使用这个函数。由于用户名值是唯一的,当我运行我的sql语句时,我将只收到1个元素,这是这个用户名的密码,如果它作为字符串可用。但是当我有string pass = cmd.ExecuteNonQuery();
我得到一个错误在我的代码。有没有办法解决这个问题,而不必创建一个数据阅读器?
private void btn_Login_Click(object sender, EventArgs e)
{
try
{
sc.Open();
SqlCommand cmd = new SqlCommand("SELECT Password FROM dbo.Login WHERE username=@UN", sc);
cmd.Parameters.AddWithValue("@UN", tb_Username);
string pass = cmd.ExecuteNonQuery();
if (Decrypt(pass) == tb_Password)
{
Find_Resource show_now = new Find_Resource();
show_now.Show();
this.Hide();
}
else MessageBox.Show("Incorrect credentials");
sc.Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
ExecuteNonQuery
返回受影响的行数。它应该用于INSERT、UPDATE和DELETE查询。您应该使用ExecuteScalar
-它从查询结果中返回第一行的第一个单元格:
string pass = (string)cmd.ExecuteScalar();
注意:确保将SqlCommand
和SqlConnection
包装到using
块中。这将确保即使在异常情况下也可以处理对象:
public string GetPassword(string username)
{
string query = "SELECT Password FROM dbo.Login WHERE username=@UN";
using(SqlConnection conn = new SqlConnection(connectionString))
using(SqlCommand cmd = new SqlCommand(query))
{
cmd.Parameters.AddWithValue("@UN", tb_Username);
conn.Open();
return (string)cmd.ExecuteScalar();
}
}
和你的主方法:
try
{
if (Decrypt(GetPassword(tb_Username)) != tb_Password)
{
MessageBox.Show("Incorrect credentials");
return;
}
Find_Resource show_now = new Find_Resource();
show_now.Show();
this.Hide();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
更改cmd。executereader
string pass = string.Empty;
using (var sqlDataReader = cmd.ExecuteReader(CommandBehavior.SingleResult | CommandBehavior.CloseConnection | CommandBehavior.SingleRow))
{
if(sqlDataReader.Read())
{
pass = sqlDataReader.GetString(0);
}
}
当你得到一个错误时,使用try catch来捕获它
所以把上面所有的代码放到
中try
{
//tha code
}
catch(Exception e)
{
MessageBox.Show(e.Message);
}
ExecuteReader
ExecuteNonQuery。您可以使用ExecuteNonQuery来执行目录操作(例如,查询数据库的结构或创建数据库对象,如表),或者通过执行UPDATE、INSERT或DELETE语句来更改数据库中的数据,而不使用DataSet。
检查ExecuteScalar, ExecuteReader和ExecuteNonQuery之间有什么区别?