通过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);
    }
}

通过c#表单登录表单

ExecuteNonQuery返回受影响的行数。它应该用于INSERT、UPDATE和DELETE查询。您应该使用ExecuteScalar -它从查询结果中返回第一行的第一个单元格:

string pass = (string)cmd.ExecuteScalar();

注意:确保将SqlCommandSqlConnection包装到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之间有什么区别?