如果我的代码出现问题,它拒绝执行我的else语句,将全局变量设置为说try = 3
运行while循环但是当我放一个无效的pin它基本上没有运行任何我会感谢任何帮助可能谢谢
while (read.Read())
{
if (read.HasRows)
{
}
//If the card isnt confiscated then do this:
if (((Boolean)(read["confiscated"]) == false))
{
string cardnum = read["cardNumber"].ToString();
string pinnum = read["PIN"].ToString();
//Compare the results in the table against those put in by the customer
if (string.Equals(cardnum, cardBox.Text) && string.Equals(pinnum, pinNumber.Text))
{
MessageBox.Show("Welcome customer");
MessageBox.Show("Card Number " + cardnum + " PIN " + pinnum);
//if the login details match and everything is correct then bring the next form up
MessageBox.Show("Details are correct");
pinNumber.Clear();
//open the options form
Form optionForm = new optionForm();
optionForm.Show();
//hide this form
this.Hide();
break;
}
else
{
if (attempts == 1)
{
sqlCommandATM.Parameters["@cardNum"].Value = cardBox.Text;
sqlCommandATM.Parameters["@confiscated"].Value = true;
MessageBox.Show("Your card has been confiscated please contact The bank of Glamorgan to resolve the issue");
pinNumber.Clear();
}
答案 0 :(得分:1)
修改强>
我试图了解你在做什么。我假设您正在尝试通过信用卡号和PIN对数据库验证某个人,并且您是通过从数据库表中获取所有条目并循环遍历它们来查找与用户输入匹配。您希望在锁定信用卡之前允许用户执行此操作三次。
我看到不止一个问题:在表中为用户找到正确的行的任务应留给数据库。这样更快,更不容易出错。所以,如果你想做得对,那么你应该有一个SQL语句,如:
int attempts = 0;
bool success = false;
while (!success && attempts < 3)
{
using (SQLCommand exists = new SQLCommand("SELECT ID FROM ... WHERE CCardNo = @cardNo AND PIN = @pin", conn))
{
exists.Parameters.AddWithValue("@cardNo", cardNum);
exists.Parameters.AddWithValue("@PIN", pinnum);
object idObject = (int)exists.ExecuteScalar();
if (idObject == null || idObject == DBNull.Value)
{
attemps++;
}
else
{
success = true;
}
if (attempts >= 3)
{
// Lock out the user
}
}
}
if (success)
{
...
}
如果确实坚持按照自己的方式进行操作,那么请确保attempts
已正确初始化并在每次登录尝试时递增 - 在当前代码中,您将增加它在您要验证的每一行上,因此您将锁定每个不在您从数据库获取的前三行内的客户。
原始回复
好的,您正在while
循环中读取DataReader中的所有数据:
while (read.Read())
{
然后以下三行做什么?如果read.HasRows
为false
,则您不会在此,因为read.Read()
已经返回false
。以下三行是没有意义的,可以删除,只留下块内的内容。
if (read.HasRows)
{
}
通常的方式是:
if (read.HasRows)
{
while (read.Read())
{
...
}
}
更难说清楚,因为您没有向我们展示完整代码 - 例如attempts
循环之前while
有什么价值?
答案 1 :(得分:0)
忽略发布代码中的语法错误,我的第一个猜测是,当attempts
语句中的控件进入1
语句时,您的else
变量未设置为attempts
,因此,根据您发布的内容代码,什么都不应该发生。你能告诉我们这个{{1}}变量被声明/改变的地方吗?
答案 2 :(得分:0)
从提供的代码中,您没有增加用户尝试输入引脚的每次尝试的尝试次数。代码在哪里;
string pinnum = read["PIN"].ToString();
attempts++;
这样的事情。
,很难说出你所拥有的东西答案 3 :(得分:0)
您说全球attempts = 3
。
如果是这种情况,您应该检查失败的尝试是否是> = 3。
if (string.Equals(cardnum, cardBox.Text) && string.Equals(pinnum, pinNumber.Text))
{
// Load account
}
else if (attempts >= 3)
{
// Confiscate card
}
else
{
attempts ++;
}