-4

So I am trying to enclose these 2 queries into try - catch so if the username/password don't exist then the exception is caught and only an error message window is shown, instead of breaking the whole application:

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

I know the logic of checking for the correct username and it's particular password is not correct but I am gonna fix that later. I now want just to know how to show the message instead of breaking the whole process.

4

3 回答 3

2

首先,不要将文本直接嵌入到您的 SQL 命令中,否则您将面临 SQL 注入攻击。
其次,您可能不需要两个查询;第一个实际上只是检查用户名的存在。使用类似的东西

select password from users where username = @username

(并使用参数提供用户名)

然后,与其依靠异常来捕获错误登录,不如检查Read()调用的结果;false 应该表示没有行(因此没有匹配的用户名/密码组合)。

于 2013-04-22T16:20:10.743 回答
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);
}

旁注:使用参数化查询!

于 2013-04-22T16:16:24.610 回答
1

要回答您的实际问题,将代码放入try catch块中会按照您的意愿进行,也就是说它将捕获错误并执行catch.

我希望您的困惑在于,在 Visual Studio 的调试模式下运行代码时,调试器无论如何都会停止错误以向您突出显示错误。当您从可执行文件运行代码时,这不会发生。

让您的程序在不因错误而停止的情况下运行您的代码(顺便说一句,我并不是说这是一个好主意)

  • 单击 Visual Studio 顶部的“调试”菜单
  • 选择“例外”
  • 取消选中“用户处理的”“公共语言运行时异常”复选框。

这应该抑制错误以模拟从可执行文件运行,并且您应该看到您的消息框。

于 2013-04-22T16:47:16.107 回答