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