2012-03-12 5 views
0

Я проектирую систему ATM в C# и для функции входа в систему Я использую базу данных SQL-сервера для сравнения номера карты и PIN-кода, введенного с теми, которые включены в базу данных , Когда введен правильный номер карты и PIN-код, все работает нормально, но когда неправильное значение, которое оно вводило, ничего не происходит вообще, и я пытаюсь выяснить его в течение некоторого времени. Есть ли у кого-нибудь идеи, что это может быть? Даже мой преподаватель не знает!'else' of if/else не выполняется, если это необходимо C#

//Select all fields from the table 'ATMCards' using the connection previously created and use the SqlDataReader to read the values 

Чтобы упростить его, я просто поставил MessageBox.Show в другой, как все, что я хочу сделать, это по крайней мере, это вызовет!

SqlCommand cmd = new SqlCommand("SELECT * FROM [ATMCards] WHERE (cardNumber = @cardNumber) AND (PIN = @PIN)", cn); 
cmd.Parameters.AddWithValue("@cardNumber", cboxSimCard.Text); 
cmd.Parameters.AddWithValue("@PIN", txtboxPIN.Text); 

cmd.Connection = cn; 
SqlDataReader r = null; 
r = cmd.ExecuteReader(); 

//While the reader is in execution: 
while (r.Read()) 
{ 
    //ADD IF NOT CONFISCATED DO THIS: 
    if (((Boolean)(r["confiscated"]) == notConfiscated)) 
    { 
     string cNum = r["cardNumber"].ToString(); 
     string pin = r["PIN"].ToString(); 

     //Compare the results in the ATMCards table against those on the form used to log in 
     if (string.Equals(cNum,cboxSimCard.Text) && string.Equals(pin,txtboxPIN.Text)) 
     { 
      MessageBox.Show("Card number "+cNum+" PIN "+pin); 
      //If the login details are correct then grant access to the menu screen by creating a new instance of it and hide the login form. Clear PIN to avoid the next user accessing the account 
      MessageBox.Show("Open form all is good"); 
      txtboxPIN.Clear(); 
      Form myNewForm = new Menu(); 
      myNewForm.Show(); 
      this.Hide(); 
      break; 
     } 

     else 
     { 
      MessageBox.Show("Here"); 
     } 
+0

И вы уверены, что 'r [" конфисковано "]! = NotConfiscated'? –

+4

Вы должны (учитесь) использовать отладчик здесь. –

+0

Надеюсь, что этот банкомат - это учебное задание, а не коммерческий продукт. Например, обычный текстовый PIN-код? – RvdK

ответ

8

Когда неправильный номер карты и пин-код пары введены, строки не будут возвращены из базы данных, поэтому while(r.Read()) возвращает ложь немедленно.

+0

Вы ответили, когда я печатал :-) – Jodrell

+0

@Jodrell, попробуй тогда! –

+0

@ Moo-Juice А я вижу, так где я должен поместить код для неправильного номера карты и пары контактов? Вне цикла while (r.Read())? –

2

Когда нет совпадений для ваших условий where, набор результатов возвращается без строк. Первый r.Read возвращает false, и содержимое цикла while никогда не выполняется.

Henk Holterman комментарии, если вы отлаживаете код, это будет очевидно.

В дополнении к простому ответу ...

Вы не должны быть выполнение вашего SQL, как это. Это оставляет вас открытыми для инъекций. Вы можете использовать Linq-To-Entities или обернуть SQL при вызове sp_ExecuteSQL.

PIN-код не должен храниться как обычный текст, а скорее как безопасный хэш PIN-кода и других данных карты.

Номер карты не должен храниться в виде простого текста. Если вам никогда не придется читать, номер карты может быть хэширован. В противном случае зашифровано

Я предполагаю, что вы проверяете данные карты, используя стандартную проверку по модулю-13 или какой-либо стандарт, перед передачей запроса в базу данных.

Я не предлагаю, чтобы вы могли воссоздать то, что на самом деле происходит внутри банкомата, но некоторые соображения безопасности, требуемые конфиденциальными данными, несомненно, принесут дополнительный кредит. (Каламбур не предусматривается)

+0

А я вижу, так где я должен поместить код для неправильного номера карты и пары контактов? Вне цикла while (r.Read())? –

+0

Ну, я думаю, вы только когда-либо хотите, чтобы одна строка была правой, меньше или больше - оба исключения. Сначала я бы обработал чтение, поэтому я мог проверять исключения перед обработкой данных. – Jodrell

+0

@Tom Crook, может положить конфискованный чек в ваше предложение where, если вы не хотите использовать использование конфискованной карты. – Jodrell

0

Человека вашего код

  1. Не безопасным и может быть введена
  2. кредитной карточки и пин-код должен быть зашифрован и у штрафной
  3. Ваш код никогда не будет показывать любое сообщение в случае сбоя так как если данные не reutrned если положение внутри пока не будет выполнена

вы можете использовать

if(reader.HasRows) 
///then do happy case 
else 
//show error message 
+0

Я думаю, мы не должны ожидать, что базовое университетское задание будет реализовано на уровне безопасности мирового уровня ... –

0

Мне кажется, что это:

if (string.Equals(cNum,cboxSimCard.Text) && string.Equals(pin,txtboxPIN.Text)) 

ли somethign неправильно. Попробуйте использовать перегрузку той же функции с помощью String.Equals(String, StringComparison).Нравится

if (cNum.Equals(cboxSimCard.Text, StringComparison.InvariantCultureIgnoreCase) && pin.Equals(txtboxPIN.Text, StringComparison.InvariantCultureIgnoreCase)) 
Смежные вопросы