所以我试图将这两个查询括起来try - catch
,所以如果用户名/密码不存在则会捕获异常,只显示错误消息窗口,而不是破坏整个应用程序:< / p>
try
{
command.CommandText = "SELECT username FROM users WHERE username='" + username + "'";
reader = command.ExecuteReader();
reader.Read();
string myUsername = reader.GetString(0);
values[0] = myUsername;
command.CommandText = "SELECT password FROM users WHERE username='" + username + "'";
reader = command.ExecuteReader();
reader.Read();
string myPassword = reader.GetString(0);
values[1] = myPassword;
}
catch (Exception)
{
MessageBox.Show("Wrong username or password!");
}
我知道检查正确用户名的逻辑并且它的特定密码不正确但我稍后会解决这个问题。我现在只想知道如何显示消息而不是打破整个过程。
答案 0 :(得分:2)
首先,不要将文本直接嵌入到SQL命令中,您将自己打开SQL注入攻击 其次,您可能不需要两个查询;第一个实际上只是检查用户名的存在。使用像
这样的东西select password from users where username = @username
(并使用参数提供用户名)
然后,检查Read()
调用的结果,而不是依赖异常来捕获错误的登录信息; false应该表示没有行(因此没有匹配的用户名/密码组合)。
答案 1 :(得分:1)
如果我理解正确,您可以通过将catch更改为:
来显示异常消息catch (Exception ex)
{
MessageBox.Show("The Exception Message: " + ex.Message);
}
但是,您可能不希望显示原始邮件。我建议您显示一条由您控制的消息:
catch (Exception ex)
{
// log the exception
// Logger.Log(ex);
MessageBox.Show("Couldn't find username: " + username);
}
答案 2 :(得分:1)
要回答您的实际问题,将代码置于try catch
块内将按您的意愿执行,也就是说它将捕获错误并执行catch
内的代码块。 / p>
我希望您的困惑在于,当在Visual Studio的调试模式下运行代码时,调试器将始终停止错误以突出显示错误。从可执行文件运行代码时不会发生这种情况。
让程序在不停止错误的情况下运行代码(顺便说一句,我不是说这是一个好主意)
这应该可以抑制错误来模仿可执行文件的运行,你应该看到你的消息框。