通过c#表单登录表单

通过c#表单登录表单,c#,sql-server,winforms,C#,Sql Server,Winforms,我正在为我的应用程序使用C#表单构建一个登录页面。 到目前为止,我已经实现了如何使用特定用户名和哈希密码插入用户名。 现在为了检索它,我使用这个函数。 由于用户名值是唯一的,所以当我运行sql语句时,我将只收到1个元素,如果该元素作为字符串可用,则该元素是该用户名的密码。 但是当我有string pass=cmd.ExecuteNonQuery()时我的代码中有一个错误。有没有办法解决这个问题而不必创建datareader private void btn_Login_Click(object

我正在为我的应用程序使用C#表单构建一个登录页面。 到目前为止,我已经实现了如何使用特定用户名和哈希密码插入用户名。 现在为了检索它,我使用这个函数。 由于用户名值是唯一的,所以当我运行sql语句时,我将只收到1个元素,如果该元素作为字符串可用,则该元素是该用户名的密码。 但是当我有
string pass=cmd.ExecuteNonQuery()时我的代码中有一个错误。有没有办法解决这个问题而不必创建datareader

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

}
返回受影响的行数。它应该用于插入、更新和删除查询。您应该使用-它从查询结果返回第一行的第一个单元格:

string pass = (string)cmd.ExecuteScalar();
注意:确保使用
块将
SqlCommand
SqlConnection
包装到
中。这将确保即使在发生异常的情况下也会处理对象:

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);
}
返回受影响的行数。它应该用于插入、更新和删除查询。您应该使用-它从查询结果返回第一行的第一个单元格:

string pass = (string)cmd.ExecuteScalar();
注意:确保使用
块将
SqlCommand
SqlConnection
包装到
中。这将确保即使在发生异常的情况下也会处理对象:

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

ExecuteOnQuery。您可以使用ExecuteOnQuery执行目录操作(例如,查询数据库的结构或创建数据库对象,如表),或者通过执行UPDATE、INSERT或DELETE语句来更改数据库中的数据,而不使用数据集

检查这个
执行查询。您可以使用ExecuteOnQuery执行目录操作(例如,查询数据库的结构或创建数据库对象,如表),或者通过执行UPDATE、INSERT或DELETE语句来更改数据库中的数据,而不使用数据集

检查这个
将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);
}


这样,您可以找到抛出的实际异常。

将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);
}


这样,您可以找到抛出的实际异常。

两个答案都有效,但在我的代码中效果更好两个答案都有效,但在我的代码中效果更好