如何在 SQL 搜索查询找不到值时显示消息



如果 SQL 查询无法找到用户名和密码输入的匹配项,我正在尝试显示"登录失败"消息。

目前"登录成功"消息运行良好。我尝试了一些解决方案,但它们不起作用。

private void tLoginBtn_Click(object sender, EventArgs e)
{
try
{
// Get values
string userName = tInputUser.Text;
string pass = tInputPass.Text;
// Search if user exists                
string user_search = "SELECT * FROM Teachers WHERE (emailAddr = '" + userName + "' and password = '" + pass + "')";
SqlCommand cmnd = new SqlCommand(user_search, con);
con.Open();
// Excute sql command and get results to an array
SqlDataReader result = cmnd.ExecuteReader();
while (result.Read())
{
string finalUsername = result[3].ToString();
string finalPass = result[4].ToString();
MessageBox.Show("Login Success");
}
}
catch (Exception ex)
{
MessageBox.Show("Error" + ex);
}
finally
{
con.Close();
}
}

如果你的查询不返回任何记录,它不会引发异常。 相反,while (result.Read())循环根本不会运行。

您可以使用以下内容专门检查结果:

if (result.HasRows)
{
MessageBox.Show("Login Success");
}
else
{
MessageBox.Show("Login Failed");
}

或者,如果您需要访问记录中的数据:

if (result.Read())
{
string finalUsername = result[3].ToString();
string finalPass = result[4].ToString();
MessageBox.Show("Login Success");
}
else
{
MessageBox.Show("Login Failed");
}

我不建议使用SELECT *进行查询,然后按索引引用字段。 最好编写SELECT emailAddr, password FROM Teachers ...并按名称访问字段,例如result["emailAddr"].

此外,您还存在一个 SQL 注入漏洞。您应该查找这意味着什么以及如何参数化查询。

此外,您似乎正在以纯文本形式存储密码。 您应该查找密码哈希和适当的存储。

两件事。首先,可以使用SqlDataReader.HasRows来了解查询是否返回了任何结果。因此,您可以说if (result.HasRows)而不是while (result.Read()).然后,您可以将else用于相反的情况(未找到用户(。

if (result.HasRows)
{
// User exists
}
else
{
// User does not exist
}

第二个问题,你正在使用字符串串联来构建查询。这让你对SQL注入持开放态度,这是不好的。应改用参数化查询:

string userSearch = "SELECT * FROM Teachers WHERE emailAddr = @email and password = @password";
// Create the command
cmnd.Parameters.AddWithValue("@email", userName);
cmnd.Parameters.AddWithValue("@password", pass);

可以在此处阅读有关参数化查询的详细信息:https://learn.microsoft.com/en-us/dotnet/api/system.data.sqlclient.sqlcommand.parameters?view=netframework-4.8

最新更新