Почему этот SQL SELECT не запускается, когда он использует действительные данные? - PullRequest
0 голосов
/ 26 марта 2019

Я практикую с C # и SQL, и я пытаюсь сделать простой email + password логин , который проверяет базу данных на соответствие входным данным.

Почему этот код возвращает ожидаемое 0, если ввод неправильный, но говорит, что строка ввода неправильная, когда используются правильные данные?

System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand();
cmd.CommandType = System.Data.CommandType.Text;

cmd.CommandText = 
  "SELECT UserPassword, UserMail FROM Users WHERE UserPassword = '" + 
   textBox2.Text + 
  "' AND UserMail = '" + 
    textBox1.Text + '\''; 

cmd.Connection = sqlConnection1;

sqlConnection1.Open();
int correct = 0;
correct = Convert.ToInt32(cmd.ExecuteScalar());
sqlConnection1.Close();

if(correct <= 0)
{
    MessageBox.Show("Wrong input. Correct = " + 
                     Convert.ToString(correct) + 
                    "\n" + 
                     cmd.CommandText);
}

textbox1 и textbox2 соответственно вводятся адрес электронной почты и пароль.

Я ожидал, что вывод "email5" + "email5" будет 5, поскольку это была пятая строка (то же самое с другими действительными данными), но я получил следующее исключение :

Произошло необработанное исключение типа 'System.FormatException' в mscorlib.dll

Дополнительная информация: входная строка была в неправильном формате.

Ответы [ 2 ]

2 голосов
/ 26 марта 2019

Насколько я вижу, вы хотите проверить, есть ли хотя бы одна запись в Users таблице с заданными значениями UserPassword и UserMail полей; если это так, пароль и электронная почта , предоставленные пользователем через textBox2.Text и textBox1.Text, равны correct. Если это ваш случай

    bool correct = false;

    //TODO: better create a connection here and not resuse existing one
    sqlConnection1.Open();

    try { 
      //DONE: wrap IDisposable into using in order to release unmanaged resources
      using (var cmd = new System.Data.SqlClient.SqlCommand()) {
        cmd.Connection = sqlConnection1; 

        //DONE: Keep sql be readable
        //DONE: Make sql be parametrized 
        //TODO: Do not store password as a plain text, but its hash
        cmd.CommandText = 
          @"SELECT 1      -- 1 we don't want to return password/eMail back
              FROM Users 
             WHERE UserPassword = @prm_Password 
               AND Upper(UserMail) = Upper(@prm_Email)"; // me@mymail.com == Me@MyMail.com

        // Simplest; more accurate choice .Add("@prm_Password", textBox2.Text, RDBMSType)
        cmd.Parameters.AddWithValue("@prm_Password", textBox2.Text);
        cmd.Parameters.AddWithValue("@prm_Email", textBox1.Text);

        using (var reader = cmd.ExecuteReader()) {
          // correct if we can read at least one record
          correct = reader.Read();
        }         
      }
    }
    finally {
      sqlConnection1.Close();
    }

    if (!correct) {
      MessageBox.Show("Wrong input... "); 
    }
0 голосов
/ 26 марта 2019

Ошибка, которую вы получаете

"Произошло необработанное исключение типа System.FormatException в mscorlib.dll

Дополнительная информация: входная строка была в неправильном формате. "

Это потому, что вы выбираете строковое значение

cmd.CommandText = "SELECT **UserPassword**, UserMail FROM Users WHERE ....

А затем вы пытаетесь преобразовать его в Int

correct = Convert.**ToInt32**(cmd.ExecuteScalar());

ExecuteScalar Выполняет запрос и возвращает первый столбец первой строки в наборе результатов, возвращенных запросом. Дополнительные столбцы или строки игнорируются.

Итак, вы пытаетесь преобразовать значение пароля в Int32, это выдает ошибку ...

Если вы используете

cmd.CommandText = "SELECT Count(*) FROM Users WHERE ....

Остальная часть вашего кода будет работать, так как это условие просто проверяет, что правильное значение больше 0

sqlConnection1.Open();
int correct = 0;
correct = Convert.ToInt32(cmd.ExecuteScalar());
sqlConnection1.Close();

if(correct <= 0)

Однако вы должны знать о риске SQL-инъекций и других плохих практиках, но это не в тему

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...